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

奉上代码: node服务demo代码=》koa2-server项目代码vue前端demo代码=》 vue-client项目代码
如果git登不上可以换gitee=》koa2-server项目代码;vue前端demo代码=》 vue-client项目代码

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

详细js文件地址=》node-rsa JSEncrypt的使用

公私钥生成

可以直接跳到下面看,这只是我记录我的探索过程的
刚开始,我使用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是登录按钮响应方法,先去后端获取公钥对密码进行加密,然后将密文传送后端解密
注意: encrypt.encrypt()只能加密字符串,其他的格式不行,所以最好加密前做一下类型转换

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后端解密就做好了

效果

获取公钥
获取公钥
加密后登录
在这里插入图片描述

页面效果
页面效果
这样登录就搞定了,后面弄下token,退出等功能

上一篇:node从入门到放弃系列之(5)mysql同步操作及登录接口demo
下一篇:node从入门到放弃系列之(7)token令牌生成、验证、注销

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值