我正在尝试添加Runscope测试来验证我发送的请求的签名。在第一步中,我想签名此请求,然后将其发送到将要验证它的服务。
我知道我可以在Runscope中添加脚本,并且我可以使用CryptoJS来签署请求。然而,CryptoJS的文档不是很有帮助,我未能签署我的请求;
我用Crypto Postman lib在Postman中做了类似的事情,代码是:
function encryptSignature(signingMetadata) {
eval(pm.globals.get('pmlib_code'));
var encryptedSignature = new pmlib.rs.KJUR.crypto.Signature({ "alg": "SHA256withRSA" });
encryptedSignature.init(config.privateKey)
var hash2 = encryptedSignature.signString(signingMetadata)
const signedEncoded = CryptoJS.enc.Base64.stringify(CryptoJS.enc.Hex.parse(hash2));
return signedEncoded;
}
尝试在Runscope中做类似的事情,我提出了以下代码:
function encryptSignature(signingMetadata) {
var hash = CryptoJS.SHA256withRSA(signingMetadata, config.privateKey);
var signedEncoded = hash.toString(CryptoJS.enc.Base64);
return signedEncoded;
}
但是得到了未定义的错误,我假设是CryptoJS;
我使用了一些在线JS编译器,当我导入
import sha256 from 'crypto-js/sha256';
import Base64 from 'crypto-js/enc-base64';
和重构代码:
var signedEncoded = Base64.stringify(sha256(signingMetadata, config.privateKey));
它编译并执行某种签名,但是签名看起来不正确(它太短了)
有人在Runscope中成功地做过这个吗?我希望你能给我一些建议;
谢谢你,
正如@Topaco提到的,CryptoJS不支持RSA加密。
您可以使用jsrsign和CryptoJS库生成签名,但是由于Runscope的限制,要使其工作很棘手。下面的代码片段正在生成签名:
var signature = new KJUR.crypto.Signature({ "alg": "SHA256withRSA" });
signature.init(privateKey); // just key as a string
var hash = signature.signString("string to sign");
const encodedSignature = CryptoJS.enc.Base64.stringify(CryptoJS.enc.Hex.parse(hash));
return encodedSignature;
,但为了使其工作,请执行以下操作:
- 从
jsrsasign
的repo,导入jsrsasign-rsa-min.js
和keyutil-1.0.js
作为一个Runscope脚本库/代码片段(可选择合并这些文件在一起) - 去掉箭头函数(Runscope限制)
- 删除所有
window
引用(Runscope限制)。jsrsign使用它来检测旧的浏览器——在这种情况下没有必要,因为我们只在Runscope环境中运行这个脚本。 - (可选)从
jsrsasign-rsa-min.js
文件中删除CryptoJS,因为它已经在Runscope环境中可用。 - 将上述库导入到测试