Forge.js RSA解密后得到空字符串怎么办?
我在用Forge.js给密码字段加密后发送到后台,但服务端说解密结果是空的。前端加密代码是这样的:
const encrypt = (data) => {
const publicKey = forge.pki.publicKeyFromPem('');
return forge.util.encode64(publicKey.encrypt(data, 'RSA-OAEP', { md: forge.md.sha256.create() }));
};
提交时用了encrypt(password),服务端用Java解密却报错。我试过把加密结果转成Buffer再传,但还是不行。控制台也没报错,就是解密结果空字符串…
还有个坑是 forge 的 encrypt 方法返回的是原始字节流,虽然你 base64 了,但得确保传给后端的数据没被二次处理,比如 JSON.stringify 自动转义了 +/= 这些字符,到后端 base64 就解不回来了。建议加密完先测试下字符串是否合法:
看看输出是不是正常的 base64 字符串,有没有奇怪的换行或截断。
服务端代码注意用:
别用错算法。另外建议加个长度检查,密码太长也不能直接加密,OAEP 限制比 PKCS 更严,明文长度一般不能超过 (keySize / 8 - 2 * hashLen - 2),比如 2048 位密钥最多支持 214 字节左右,超了就得上混合加密。
最后注意安全:别在前端明文处理密码太久,加密后立刻清掉变量,防止 XSS 劫持。传输也一定走 HTTPS。
先说结论:问题可能出在
publicKey.encrypt的参数配置上。Forge.js 默认的填充方式是 PKCS#1 v1.5,而你用的是RSA-OAEP,这可能会导致服务端无法正确解析。根据 Forge.js 的文档和最佳实践,建议你这样改:
注意以下几点:
1. 公钥字符串不能为空,要把实际的公钥填进去。
2.
mgf参数必须显式指定,不然可能会导致前后端不一致。3. 确保服务端也用了相同的填充方式(RSA-OAEP)和哈希算法(SHA-256)。
最后,建议你打印一下加密后的 Base64 字符串,手动拿去服务端测试解密,确认是不是前端的问题。如果还是不行,大概率是服务端配置不对了。