准备
准备密钥:
·可以使用node-rsa生成,通过接口返回给前端。
·也可以使用在线生成密钥的网站
网站: web.chacuo.net/netrsakeypa…
这里介绍使用在线生成的方式。注意:不正确的密钥会导致解码错误。最好还是使用这个网站。我用着没有问题。
前端:
安装 jsencrypt
yarn add jsencrypt
使用:
import JSEncrypt from "jsencrypt";
const encrypt = new JSEncrypt({});
// 生成的公钥
encrypt.setPublicKey(
`
-----BEGIN PUBLIC KEY-----
MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCyIIYDmRTT6e7yuMP2i6enSNdu
cvgVDQD/OsCvjTB/2+c/UVP7pCCLu+3iEjrKlaw6fPkWzf5MmG6Sp52Ar4KI1aYF
a0QieZvslpwdJs8lVQaf8bohG+IdckCrG1H+20itGy0cbmnoe8f0RILAgkSaIM5W
Gmm301Yc22wgGJOuzQIDAQAB
-----END PUBLIC KEY-----
`
);
// 调用接口传参数
const res = await APIPostLogin({
username: encrypt.encrypt(values.username).toString(),
password: encrypt.encrypt(values.password).toString(),
});
调用接口后效果:
前端做的工作就到此为止了。
后端
node解码需要node-rsa这个包
安装yarn add node-rsa
使用:
// 这里默认你传进来的是 {username: '加密后的密文',password: 'xxxx'}
const decrypt = (msg) => {
const key = new NodeRsa(privateKey); // privateKey 生成的私钥
// 这里是设置上面在在线生成秘钥的类型
key.setOptions({ encryptionScheme: "pkcs1" });
let resultObject = {};
const arr = Object.keys(msg).map((item) => {
const a = {};
a[item] = key.decrypt(msg[item], "utf8");
return a;
});
arr.forEach((item) => {
resultObject = { ...resultObject, ...item };
});
return resultObject;
};
调用这个方法就可以了,返回的是类似下面格式的解码后的字符串数组:
{ username: '123', password: '123' }
踩到的坑
- 传入node-rsa的
decrypt
第一个参数必须是字符串或者buffer类型 - encryptionScheme: "pkcs1"的类型必须正确
以上必须注意,否则会导致解码错误