vue 前端数据进行 RSA 加密、解密、签名、验签
jsrsasign
未整理完
关于加密
base64 加密是属于双向加密,就是加密后可以解密回来
MD5 是单向加密,就是加密后无法解密。
MD5 加盐加密就是将(用户名+密码)进行MD5加密(类似都叫加盐,这里用户名就是盐值)
支付宝的公钥私钥加密,公钥解密私钥,这个是最安全的加密方式.
另外https是使用了安全证书。
jsrsasign、jsencrypt、encryptlong
encryptlong是基于jsencrypt扩展的长文本分段加解密功能
下载jsencrypt , encryptlong
引入jsencrypt实现数据RSA加密
import JSEncrypt from “jsencrypt” // 处理长文本数据报错 Message too long for RSA
引入encryptlong实现数据RSA加密
import encrypt from “encryptlong”
密钥对说明
- 密钥对需要带开头(-----BEGIN PRIVATE KEY-----)以及相应的尾标识。
- 密钥对格式为PCK#8时使用KEYUTIL.getKey(yourPEMKey)进行解析,而PCK#1则使用rsa.readPrivateKeyFromPEMString。
- sig.sign()生成的是一串16进制字符串(hexadecimal),通过jsrsasign的全局方法hextob64()进行转换。
- 最后根据情况 需要使用encodeURICompoent(sign)将加密后的密文进行转码,因为一些+号传到后端可能不识别。 (这个浏览器会自动加上)
jsrsasign
export default{
generateRsaKey(data){
//let data = "deviceId=20636&token=f6d20a8866c04a2d8ca50d5494242bad&salt=162366271653";
//初始化RSAKey
var rsa = new Jsrsasign.RSAKey();
//私钥要写开头和结束
var pk = '-----BEGIN PRIVATE KEY-----' + privateKey + '-----END PRIVATE KEY-----'
// 读取解析pem格式的秘钥, 生成秘钥实例 (RSAKey)
rsa = Jsrsasign.KEYUTIL.getKey(pk);
//sign
//加签,创建Signature对象,设置签名编码算法
var signature = new Jsrsasign.KJUR.crypto.Signature({"alg":"SHA1withRSA"})
//初始化
signature.init(rsa)
//传入待签明文
signature.updateString(data)
//签名, 得到16进制字符串结果
console.log("生成密钥(16进制字符串) "+ signature.sign())
//
//var encryptData = Jsrsasign.KJUR.crypto.Cipher.encrypt(signature.sign(), rsa);
//console.log("解密 "+ encryptData)
//生成base64密文
var sign = Jsrsasign.hextob64(signature.sign())
//console.log("SIGN Length: " + sign.length + ", Base64密文: " + sign)
return sign
//简化方式2: 方式1的基础上, 去掉显示读取私钥, 去掉初始化步骤(init(..))
var signature2 = new Jsrsasign.KJUR.crypto.Signature({"alg":"SHA1withRSA", "prvkeypem": prik})
signature2.updateString(data)
console.log("生成签名2(16进制字符串) "+ signature2.sign())
//参考
//对加密后的内容进行URI编码,将所有中文encoder掉(此函数是js原生函数)
//sign = encodeURIComponent(sign)
//console.log("SIGN URI编码: " + sign)
return sign
拼接到请求参数
//var params = data + '&sign=' + sign;
// console.log("接口 DATA params: " + params)
// return params
},
}
rsaPublicEncrypt(){
//注:处理长文本数据报错 Message too long for RSA
//let data = "deviceId=20636&token=f6d20a8866c04a2d8ca50d5494242bad&salt=162366271653";
let data = "password=123456";
//加密, 读取解析pem格式的秘钥, 生成秘钥实例 (RSAKey)
var rsa = new Jsrsasign.RSAKey();
console.log(rsa)
rsa = Jsrsasign.KEYUTIL.getKey('-----BEGIN PUBLIC KEY-----' + publicKey + '-----END PUBLIC KEY-----');
console.log("-----RSAKey-----")
console.log(rsa)
var encryptData = Jsrsasign.KJUR.crypto.Cipher.encrypt(data, rsa);
console.log("生成加密数据: " + encryptData)
}
JSEncrypt
/* JSEncrypt加密*/
rsaPublicData(data){
//公钥key
let jsencrypt = new JSEncrypt()
jsencrypt.setPublicKey(publicKey)
let result = jsencrypt.encrypt(JSON.stringify(data));
console.log("公钥加密:" + result)
return result
},
/* JSEncrypt解密*/
rsaPrivateData(data){
let jsencrypt = new JSEncrypt()
jsencrypt.setPrivateKey(privateKey)
let result = jsencrypt.decrypt(JSON.stringify(data));
console.log("私钥解密:" + result)
return result
},
encryptLong(data){
let encryptor = new EncryptLong()
encryptor.setPublicKey(publicKey)
/* 加密前必须把数据转化成字符串*/
let result = encryptor.encryptLong(JSON.stringify(data))
console.log("EncryptLong 公钥加密:" + result)
return result
},
decryptLong(data){
//私钥key
let encryptor = new EncryptLong()
encryptor.setPrivateKey(privateKey)
let result = encryptor.decryptLong(data)
console.log("DecryptLong 私钥解密:" + result)
return result
}
参考资料
RSA公钥私钥加密解密
https://www.bejson.com/enc/rsa/#18
jsrsasign 进行 RSA 加密、解密、签名、验签
https://www.cnblogs.com/kgdxpr/p/12651650.html
在VUE中使用RSA加密解密加签解签
https://blog.csdn.net/weixin_34256074/article/details/91373035
https://blog.csdn.net/sophie_u/article/details/79881872
https://blog.csdn.net/shizhesx/article/details/109642336
后台
AES加密解密(key是16位)
https://www.cnblogs.com/ymxl/p/13322418.html
JAVA 中解密RSA算法JS加密实例详解
https://www.jb51.net/article/111141.htm
更多推荐
所有评论(0)