#293·jsencrypt

前端使用 SHA256 为 HMAC 执行 RSA 签名,但长度不正确,导致服务器无法验证该签名。

作者: stdzwei创建于 2023年4月20日更新于 2025年5月15日

我的代码 rawGenerateEncryptData(rsa, obj, function sign(hmac) { let rsa = new JSEncrypt() rsa.setPrivateKey(privateKey) return rsa.sign(hmac, CryptoJS.SHA256, "sha256"); }) 错误发生的位置 RSAKey.prototype.sign = function (text, digestMethod, digestName) { // ... var h = c.toString(16); if ((h.length & 1) == 0) { return h; } else { return "0" + h; } } 问题的原因: digestName 为 SHA-256,但 h 的长度可能不为 512。如果使用 & 运算符,当长度为 510 时,它不会在字符串的开头附加 0,但 SHA-256 要求 256。此外,510 >> 1 为 255。 修复方法 如果 digestName 为 'sha256' 且 (h.length >> 1) 不等于 256,则使用下面的代码: const arr = [] for (let i = 0; i < ((256 << 1) - h.length); i++) { arr.push('0') } return arr.join('') + h; 否则,如果 (h.length & 1) 为 0,则返回 h; 否则,返回 "0" + h;

内容来源: travist/jsencrypt