前端jsencrypt加密,后端node-rsa解密

259 阅读1分钟

准备

准备密钥:

·可以使用node-rsa生成,通过接口返回给前端。

·也可以使用在线生成密钥的网站

网站: web.chacuo.net/netrsakeypa…

这里介绍使用在线生成的方式。注意:不正确的密钥会导致解码错误。最好还是使用这个网站。我用着没有问题。 image.png

前端:

安装 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(),
    });
    
 

调用接口后效果:

image.png

前端做的工作就到此为止了。

后端

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"的类型必须正确

以上必须注意,否则会导致解码错误