JavaScript多平台兼容RSA加密解决方案

模块特性

使用方法


// 生成公私钥 pkcs #8 pem格式
let { publicKey, privateKey } = Signature.RSA.generateKeys ( 1024, 'pkcs8' );

console.log ( publicKey, privateKey );

// RSA对象
let rsa = new Signature.RSA ( );

// 设置公私钥
rsa.setPublicKey ( publicKey );
rsa.setPrivateKey ( privateKey );

let unsigned = 'hello world!';

// 字符串签名
let sign = rsa.sign ( unsigned, 'base64'/*buffer|binary|hex*/ );

console.log ( 'sign', sign );

// 签名验证
let verified = rsa.verify ( unsigned, sign, 'base64'/*buffer|binary|hex*/ );

console.log ( 'verified', verified );

let unencrypt = 'Unencrypt string';

// 字符串加密
let encrypted = rsa.encrypt ( unencrypt, 'base64'/*buffer|binary|hex*/ );

console.log ( 'encrypted', encrypted );

// 解密
let decrypted = rsa.decrypt ( encrypted );

console.log ( 'decrypted', decrypted );

高级用法


let keys = Signature.RSA.generateKeys ( );

let signature = new Signature ( );

let rsa = signature.rsa ( );
// let md5 = signature.md5 ( );
// let sha256 = signature.sha256 ( );

let unsigned = 'hello world!';

let sign = rsa
.update ( unsigned ) // 更新源数据
.setPrivateKey ( keys.privateKey ) // 设置私钥
.digest ( 'base64' ); // 生成签名

console.log ( 'sign', sign );

let verified = rsa
.update ( unsigned ) // 更新源数据, 此处可以忽略
.setPublicKey ( keys.publicKey ) // 设置公钥
.verify ( sign, 'base64' ); // 验证签名

console.log ( 'verified', verified );

对象签名/验签

对象签名模式是先把对象转成querystring, 对象内的json内容会被转成JSONString, 然后再加上签名类型字段, 有盐的话会加盐字段, 最后进行字符串签名.
应用场景:

  • 微信支付/支付宝支付签名
  • 数据传输签名

let signature = new Signature ( );

// 默认的 formOptions, 可以不用设置
signature.formOptions = {
  signKey: 'sign', // 放置签名的字段
  signTypeKey: 'signType', // 放置签名类型的字段
  signSaltKey: 'key', // 盐值字段
  ignoreKeys: [ // 签名忽略的字段
    'sign', 'key'
  ],
  salt: "" // 盐
};

let signer = signature.sha256 ( );
// let signer = signature.rsa ( );

let form = { user: "1589235", userInfo: { 
    nickname: "Liping Ruan",
    avatar: "@%FFOISJAFJZC"
} };

let { sign, querystring } = signer
.update ( form )
.form ( true ) // 设置 签名/验签 为对象签名模式
.digest ( 'hex' ); // 签名输出 16进制 字符串

console.log ( 'sign', sign );

let verified = signer.verify ( sign, 'hex' );

console.log ( 'verified', verified );

加盐和自定义formOptions


let signature = new Signature ( );

let formOptions = signature.formOptions;

formOptions.signKey = 'sign';
formOptions.signTypeKey = 'sign_type';
formOptions.signSaltKey = 'sign_salt';
formOptions.ignoreKeys = [ 'sign', 'sign_salt' ];
formOptions.salt = "Default salt"; // 默认盐, 可以不设置

let keys = Signature.RSA.generateKeys ( 1024 );

let json = { a:1,b:2 };

let signer = signature.rsa ( )
.update ( json )
.setPublicKey ( keys.publicKey )
.setPrivateKey ( keys.privateKey )
.form ( true )
.formOptions ( {
  salt: "This is salt", // &SIGN_SALT=This%20is%20salt
} );


let { sign, querystring } = signer.digest ( 'hex' );

console.log ( 'sign', sign );
console.log ( 'signed form', json );
console.log ( 'signed querystring', querystring );

let verified = signer.verify ( sign, 'hex' );

console.log ( 'verified', verified );

RSA私钥加密/公钥解密

私钥加密公钥解密的需求不大, 所以只实现了字符串加解密

let rsa = new Signature.RSA ( );

let keys = Signature.RSA.generateKeys ( 1024 );

// 设置公私钥
rsa.setPrivateKey ( keys.privateKey );

rsa.setPublicKey ( keys.publicKey );

let uncrypted = 'hello world';

console.log ( 'uncrypted', uncrypted );

// 使用私钥加密
let encrypted = rsa.keys.encryptPrivate(uncrypted,'base64'/*buffer|binary|hex*/);

console.log ( 'encrypted', encrypted );

// 使用公钥解密
let decrypted = rsa.keys.decryptPublic ( encrypted, 'utf8' );

console.log ( 'decrypted', decrypted );
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 姓名:于川皓 学号:16140210089 转载自:https://baike.baidu.com/item/RS...
    道无涯_cc76阅读 2,856评论 0 1
  • 〇、序言 货币由于其天然属性决定了其与安全不可分割的联系,从最早的金库、保险柜、镖局到后来的ATM机、运钞车;从存...
    怒马2048阅读 39,984评论 4 79
  • 前言 本文梳理主要基于书籍《Java加密与解密的艺术》、维基百科、百度百科以及网络上众多资料,如有涉及版权问题,请...
    hello_cyz阅读 2,376评论 1 7
  • 数字证书原理 - 无恙 - 博客园 文中首先解释了加密解密的一些基础知识和概念,然后通过一个加密通信过程的例子说明...
    拉肚阅读 1,816评论 0 3
  • 找到目标文件(这是我本机的)C:\Users\Administrator\AppData\Roaming\Mozi...
    pysasuke阅读 298评论 0 0

友情链接更多精彩内容