前端
技术随笔
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 仅作过渡补充。