node从入门到放弃系列之(6)RSA前端加密node-rsa JSEncrypt的使用

奉上代码: node服务demo代码=》koa2-server项目代码;vue前端demo代码=》 vue-client项目代码

我查了(百度)下,用的比较多的加密是JSEncrypt,附上大佬的帖子=》RSA前端加密,crypto node-rsa Node后端解密

公私钥生成

可以直接跳到下面看,这只是我记录我的探索过程的
刚开始,我使用openssl来生成rsa_public_key.pem、rsa_private_key.pem文件,下载地址:Win32OpenSSL,然后用fs读取pem文件代码如下,但是无法读取。最后直接使用了node-rsa模块,十分简单

const fs = require('fs')

const publicKey = fs.readFileSync('./rsa_public_key.pem').toString('utf-8')
const privateKey = fs.readFileSync('./rsa_private_key.pem').toString('utf-8')

console.log(publicKey) //公钥
console.log(privateKey) //私钥

node-rsa JSEncrypt模块使用

前端加密 JSEncrypt模块使用

JSEncrypt: https://www.npmjs.com/package/jsencrypt

signIn() {
  this.publicKey()
},
async publicKey() {
   // 获取加密公钥
   const res = await this.$api.login.publicKey() // 公钥获取
   if (res) {
     const encrypt = new JSEncrypt()
     encrypt.setPublicKey(res)
     const encrypted = encrypt.encrypt(this.form.password) // 加密
     this.$set(this.form, 'password', encrypted)
     this.login()
   }
},
async login() {
   //  加密后登录
   const res = await this.$api.login.login(this.form)
   if (res) {
     window.location.href = 'main.html'
   }
}

signIn是登录按钮响应方法,先去后端获取公钥对密码进行加密,然后将密文传送后端解密

node解密 node-rsa模块使用

更多参数说明请看node-rsa: https://www.npmjs.com/package/node-rsa.

const mysql = require('../mysql');
const router = require('koa-router')();
const paramCheck = require('../tool/paramCheck');

const NodeRSA = require('node-rsa');
const key = new NodeRSA({ b: 1024 }); // 生成新的1024位长度密钥
key.setOptions({ encryptionScheme: 'pkcs1' }); // 用于加密的填充方法,可以为'pkcs1_oaep'、 'pkcs1'. 默认:'pkcs1_oaep'。但是改成'pkcs1_oaep'解密会出错
 
router.prefix('/security');

router.post('/login', async (ctx, next) => {
  const requestParam = ['name', 'password'];
  const user = ctx.request.body;
  if (paramCheck.check(user, requestParam) !== true) {
    ctx.error([0, paramCheck.check(user, requestParam)]);
  } else {
    const password = user.password.replace(/\s+/g, '+'); // 防止公钥有空格存在
    user.password = key.decrypt(password, 'utf8'); // 解密
    // eslint-disable-next-line quotes
    const sql = "select * from `user` where `name`='" + user.name + "' and `password`='" + user.password + "'";
    const result = await mysql.query(sql);
    if (result[0] && result[0].is_cancel === 0) {
      ctx.success(true);
    } else {
      ctx.error([0, '用户名或密码错误']);
    }
  }
});

// 加密公钥获取
router.get('/publicKey', async (ctx, next) => {
  const publicKey = key.exportKey('public'); // 生成公钥
  ctx.success(publicKey);
});

module.exports = router;

这样前端加密,node后端解密就做好了

效果

获取公钥
node从入门到放弃系列之(6)RSA前端加密node-rsa JSEncrypt的使用_第1张图片
加密后登录
node从入门到放弃系列之(6)RSA前端加密node-rsa JSEncrypt的使用_第2张图片

页面效果
node从入门到放弃系列之(6)RSA前端加密node-rsa JSEncrypt的使用_第3张图片
这样登录就搞定了,后面弄下token,退出等功能

上一篇:node从入门到放弃系列之(5)mysql同步操作及登录接口demo
下一篇:未完待续!!!

你可能感兴趣的:(node从入门到放弃,nodejs)