我正在使用jsrsasign,我有一个我之前生成的RSA公钥和私钥。我使用以下代码生成签名。
var key = new RSAKey();
key.readPrivateKeyFromPEMString($("#private")[0].value); // "private" is a textarea containing the PEM encoded private key.
var sig = new KJUR.crypto.Signature({"alg": "SHA1withRSA", "prov": "cryptojs/jsrsa"});
sig.initSign(key);
sig.updateString('message');
var sigValueHex = sig.sign();
这产生了预期的十六进制签名。 jsrsasign的文档提供了以下代码来验证签名。
var sig = new KJUR.crypto.Signature({"alg": "SHA1withRSA", "prov": "cryptojs/jsrsa"});
sig.initVerifyByCertificatePEM("-----BEGIN CERTIFICATE-----(snip)");
sig.updateString('message');
var isValid = sig.verify(sigValueHex);
我的问题是我没有要验证的证书。 sig.sign()
仅提供签名,不提供证书。最初也有sig.initVerifyByPublicKey(RSAKey)
似乎很有希望。但是,RSAKey只能获取私有密钥,而不是公钥。
所以,我的问题是如何获得此证书?如果我不能,我如何从 public 键获取RSAKey对象?如果我不能 ,是否有更好的方法来使用javascript进行数字签名?
我正在使用jsrsasign和jQuery。 http://kjur.github.io/jsrsasign/
如果用我正在使用的方法无法做到这一点,有更好的方法吗?我的主要目标是能够向服务器发送消息,并确保消息没有被篡改,并且它来自正确的位置。此处不支持SSL。该消息不需要加密,只需要保护。
答案 0 :(得分:2)
您可以使用KEYUTIL.getKey(param)
创建公钥,其中“param”可以是包含证书或公钥的字符串。
Here are the docs for that method
示例:强>
var publicKey = KEYUTIL.getKey(publicKeyString);
var sig = new r.Signature({"alg": "SHA256withRSA", "prov": "cryptojs/jsrsa"});
sig.initVerifyByPublicKey(publicKey);
sig.updateString(message);
var isValid = sig.verify(signature);
希望有所帮助。
答案 1 :(得分:1)
您可以使用openssl生成X.509自签名密钥/证书对。
openssl req -newkey rsa:4096 -x509 -nodes -keyout key.pem -out certificate.pem
然后将certificate.pem
上传到服务器,并使用key.pem
在客户端上签名消息。
消息和签名可以在服务器上验证。
以下是使用 jsrsasign 的示例代码:
const jsrsasign = require("jsrsasign");
const fs = require('fs');
// sign
let key = fs.readFileSync("./key.pem", "utf-8");
let sig = new jsrsasign.KJUR.crypto.Signature({"alg": "SHA1withRSA"});
sig.init(key);
sig.updateString("message");
const signature = sig.sign();
// verify
let certificate = fs.readFileSync("./certificate.pem", "utf-8");
let ver = new jsrsasign.KJUR.crypto.Signature({"alg": "SHA1withRSA"});
ver.init(certificate);
ver.updateString("message");
ver.verify(signature); // return true
供您参考。