RSA介绍
rsa算法是最重要的算法之一,它是一种非对称加密,是目前最有影响力的加密方式之一,一般由发送方(客户端)和接收方(服务端)各持有一对公钥和私钥。
私钥可以推出公钥,公钥不能推出私钥。
数据交换的过程中,双方交换自己的公钥。各自私钥不公开。
发送时使用对方的公钥进行加密。接收对方发来的密文时,使用自己私钥进行解密。
发送方使用私钥将信息进行加签(签名),将密文与签名作为参数发起请求。
接收方用自己私钥解密得到的明文,请求方公钥,接收的签名,进行验签(签名验证)。
注释:必须会nodejs才能实现
一、配置后端环境
1、下载第三方包rsa
npm i node-rsa/yarn add node-rsa
2、引入node-rsa并使用
var NodeRSA = require('node-rsa');
var key = new NodeRSA({ b: 512 }); //生成新的512位长度密
var text = 'Hello RSA!'; // 加密前数据
// key.setOptions({ encryptionScheme: 'pkcs1' });
var encrypted = key.encrypt("encrypted", "base64"); // 加密后数据
console.log("encrypted:", encrypted);
var decrypted = key.decrypt(encrypted, 'utf8'); // 解密后数据
console.log('decrypted: ', decrypted);
key.encrypt"加密的数据",加密方式)
结果:无规则的字符
key.decrypt("加密后的数据",“utf8”)
结果:解密后的数据
3、项目中使用
node代码实现
const publicKey = `
-----BEGIN PUBLIC KEY-----
MFwwDQYJKoZIhvcNAQEBBQADSwAwSAJBAISIIx8u/n7M6GyGoXIotkDZKfDk28JJ
3jDhhhFm2i8+2h5NJqmgYIZIsGR4TdeD/Uti0UYFfpdVAsK4/fgyGqsCAwEAAQ==
-----END PUBLIC KEY-----
`; //公钥
const privateKey = `
-----BEGIN RSA PRIVATE KEY-----
MIIBOwIBAAJBAISIIx8u/n7M6GyGoXIotkDZKfDk28JJ3jDhhhFm2i8+2h5NJqmg
YIZIsGR4TdeD/Uti0UYFfpdVAsK4/fgyGqsCAwEAAQJAHtZSXcIggz6IYiAdVqO0
bHhbMur9W0K2yWbgPBJTeCRxAdsx2ZJK45WfgOn+vCuuXQKNrADk84eCGyg/32AB
0QIhALlhkxdzAvUg4Q1gzn6n6nRI3C2jFPB6XOd64DMv05KpAiEAtwStPQPP5Kyx
3yxmPlprPeOJZdSfYs9RJ/pdQ/+NqzMCIQCCYYL/cg95chd2vkhdQiIeiQP6QQHA
JH9k+sHmnlOSiQIgHn1S9wU5jxkOEOXuqpiZoRfU/ffsDaQIGybkfr2GNm0CIQCK
TUs08mJG+BUvmyYe6YgY5MHuNoKx4ewXh/P0uaxPHw==
-----END RSA PRIVATE KEY-----
`; //私钥
let mykey = new NodeRSA(privateKey);
const encryptedText = mykey.encrypt("sdsadasd", 'base64'); // 加密后数据
console.log('加密: ', encryptedText);
mykey.setOptions({ encryptionScheme: 'pkcs1' })
var decrypted = mykey.decrypt(encryptedText, 'utf8'); // 解密后数据
console.log('解密: ', decrypted);
二、配置前端代码
解决前端加密长太长报错Message too long for RSA
我们只需要给请求拦截器,给数据进行加密即可
1、首先配置环境
下载jsencrypt
npm i jsencrypt/ yarn add jsencrypt
2、引入并使用
注释:因为我这边只是请求数据的时候加,这个功能, 所有只是给请求
import { JSEncrypt } from 'jsencrypt';
const encrypt = new JSEncrypt();
encrypt.setPublicKey(`
-----BEGIN PUBLIC KEY-----
MFwwDQYJKoZIhvcNAQEBBQADSwAwSAJBAISIIx8u/n7M6GyGoXIotkDZKfDk28JJ
3jDhhhFm2i8+2h5NJqmgYIZIsGR4TdeD/Uti0UYFfpdVAsK4/fgyGqsCAwEAAQ==
-----END PUBLIC KEY-----
`);
if (options?.params) {
if (Object.keys(options?.params)?.length > 0) {
const data = JSON.stringify(options.params)
options.params = encrypt.encrypt(data)
}
}
if (options?.data) {
if (Object.keys(options?.data)?.length > 0) {
const data = JSON.stringify(options.data)
options.data = encrypt.encrypt(data)
}
}
encrypt.setPublicKey("秘钥") // 设置公钥
encrypt.encrypt(“加密的数据”) //加密的数据
三、结果效果图
请求数据
响应回来数据
好的,到这里