如何使用jsrsasign获取证书以验证我的RSA数字签名?

时间:2014-03-18 01:51:14

标签: javascript security cryptography digital-signature

我正在使用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。该消息不需要加密,只需要保护。

2 个答案:

答案 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

供您参考。