RN签名、验签
本文解决了RN的RSA签名、验签问题。
用到的第三方库:jsrsasign
// 安装jsrsasign库
npm install jsrsasign
签名API:Signature
官网示例代码如下:
// RSA signature generation
var sig = new KJUR.crypto.Signature({"alg": "SHA1withRSA"});
sig.init(prvKeyPEM);
sig.updateString('aaa');
var hSigVal = sig.sign();
// DSA signature validation
var sig2 = new KJUR.crypto.Signature({"alg": "SHA1withDSA"});
sig2.init(certPEM);
sig.updateString('aaa');
var isValid = sig2.verify(hSigVal);
// ECDSA signing
var sig = new KJUR.crypto.Signature({'alg':'SHA1withECDSA'});
sig.init(prvKeyPEM);
sig.updateString('aaa');
var sigValueHex = sig.sign();
// ECDSA verifying
var sig2 = new KJUR.crypto.Signature({'alg':'SHA1withECDSA'});
sig.init(certPEM);
sig.updateString('aaa');
var isValid = sig.verify(sigValueHex);
实际使用代码如下:
/* -------------------------- 签名 ------------------------ */
// 导入密钥文件
import * as key from "./key";
// 导入jsrsasign库
var r = require('jsrsasign');
// 将密钥转码
var k = r.b64tohex(key.pri);
// 创建RSAKey对象
var rsa = new r.RSAKey();
// 传入密钥
rsa.readPKCS8PrvKeyHex(k);
// 创建Signature对象,设置签名编码算法
var sig = new r.KJUR.crypto.Signature({"alg": "SHA256withRSA"});
// 添加RSAKey
sig.init(rsa);
// 添加原文
sig.updateString('Message');
// 签名
var hSigVal = sig.sign();
// 对已签名的密文进行转码
var s = r.hex2b64(hSigVal);
// 控制台打印
console.log(s);
// 对话框打印
alert(s);
/* -------------------------- 验签 ------------------------ */
// 已签名和转码的密文
var m = "***密钥***";
// 将密钥转码
var k = r.b64tohex(key.pubYS);
// 创建RSAKey对象
var rsa = new r.RSAKey();
// 传入密钥
rsa.readPKCS8PubKeyHex(k);
// 创建Signature对象,设置签名编码算法
var sig = new r.KJUR.crypto.Signature({"alg": "SHA256withRSA"});
// 添加RSAKey
sig.init(rsa);
// 添加原文
sig.updateString("Message");
// 验证签名
var isValid = sig.verify(r.b64tohex(m));
// 控制台打印
console.log(isValid);
// 对话框打印
alert(isValid);