前端 技术随笔

RSA 非对称加密实现 HTTP 密码加密传输(前端 jsencrypt + 后端解密)

在尚未全面启用 HTTPS 时,可以先用 RSA 非对称加密,让密码不以明文在网络上传输。思路:前端用后端下发的公钥加密密码,后端用私钥解密。其安全性基于“对极大整数做因数分解非常困难”。

注意:RSA 只能保证密码不以明文传输,无法防中间人攻击(公钥本身可被替换)。真正安全仍应上 HTTPS,本文方案更适合作为过渡。

一、后端生成密钥对(PHP 示例)

function generatePubPri() {
    $config = array("config" => "/path/to/openssl.cnf");
    $res = openssl_pkey_new($config);
    openssl_pkey_export($res, $pri, null, $config);
    $d = openssl_pkey_get_details($res);
    $pub = $d["key"];
    // 将 $pub、$pri 妥善保存,公钥下发给前端
}

前提:PHP 已安装并加载 openssl 扩展。每次生成的密钥对都不同。

二、前端用公钥加密(jsencrypt)

<script src="jsencrypt.js"></script>
<script>
  var encrypt = new JSEncrypt();
  encrypt.setPublicKey(publicKey);   // 后端下发的公钥字符串
  var encrypted = encrypt.encrypt("123456");
  // 将 encrypted 通过 AJAX 提交给后端
</script>

由于填充随机,同一密码每次加密得到的密文都不同,这是正常现象。

三、后端用私钥解密

function decrypt($data, $privkey) {
    if (openssl_private_decrypt(base64_decode($data), $decrypted, $privkey)) {
        return $decrypted;
    }
    return false;
}

四、Java 后端的等价做法

若后端是 Spring Boot,可用 JDK 自带的 KeyPairGenerator 生成密钥,用 Cipher 配合 RSA/ECB/PKCS1Padding 做加解密,前端依旧用 jsencrypt,两者密钥格式(PKCS#8 / X.509)需对应。

五、小结与建议

  • 密钥对由后端生成,公钥下发、私钥绝对不能暴露给前端。
  • 单次 RSA 加密有长度上限(受密钥位数限制),通常不用于加密长文本,仅用于加密密码或对称密钥。
  • 条件允许务必升级到 HTTPS,RSA 仅作过渡补充。
标签
RSA加密安全