前端用公钥加密数据后端却解密失败,怎么回事?
我在前端用 RSA 公钥加密用户密码,传给后端 PHP 解密,但总是报错“Decryption error”。明明公私钥是配对的,本地测试也正常,怎么一到前后端联调就不行了?
我用的是 jsencrypt 库,代码大概这样:
const encrypt = new JSEncrypt();
encrypt.setPublicKey(<code>-----BEGIN PUBLIC KEY-----
MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQC...
-----END PUBLIC KEY-----</code>);
const encrypted = encrypt.encrypt('123456');
fetch('/login', { method: 'POST', body: JSON.stringify({ pwd: encrypted }) });
后端用 openssl_private_decrypt() 解密,但一直失败。是不是加密方式或者填充模式的问题?
先检查下你的PHP代码,确保openssl_private_decrypt的时候指定填充方式:
另外记得前端发过来的数据要用base64编码一下,后端再decode回来。JS的加密结果是二进制的,直接传输容易出错。
复制这个加密后的数据处理:
const encrypted = encrypt.encrypt('123456');改成:
const encrypted = btoa(encrypt.encrypt('123456'));这俩改完应该就能正常解密了。搞这种加密真挺烦的,但没办法,安全要求高啊。