vue+node使用RSA非对称加密,实现登录接口加密密码

背景

登录接口,密码这种重要信息不可以用明文传输,必须加密处理。

这里就可以使用RSA非对称加密,后端生成公钥和私钥。

公钥 :给前端,公钥可以暴露出来 ,没有影响,因为公钥加密的数据只有私钥才能解密。

私钥:留在后端,用于解密。

实现

一、后端生成公钥私钥

node可以直接使用【crypto】模块,利用如下代码即可完成公钥和私钥的生成,和数据的加解密,代码均有注释:

javascript 复制代码
const { generateKeyPairSync } = require('crypto')
const { publicEncrypt, privateDecrypt } = require('crypto')

// 配置
const { publicKey, privateKey } = generateKeyPairSync('rsa', {
  modulusLength: 1024,
  publicKeyEncoding: {
    type: 'spki',
    format: 'pem'
  },
  privateKeyEncoding: {
    type: 'pkcs8',
    format: 'pem'
  }
})

// 生成密钥
const pub = publicKey.toString()
const pri = privateKey.toString()
console.log('---------------公钥--------------\n' + pub)
console.log('---------------私钥--------------\n' + pri)

// 需要加密的数据
const data = 'hello world'

// 公钥加密
const encryptData = publicEncrypt(pub, Buffer.from(data)).toString('base64')
console.log('加密后:', encryptData)

// 私钥解密
const decryptData = privateDecrypt(pri, Buffer.from(encryptData.toString('base64'), 'base64'))
console.log('解密后:', decryptData.toString())

效果如下:

公钥:

私钥:

加解密情况:

二、前端使用公钥加密

前端vue加密很简单,这里模拟下获得后端的公钥,然后加密密码

javascript 复制代码
import {publicEncrypt} from 'crypto'

function login (password) {
    // 密码rsa公钥加密(password是密码原文,passwordRsa为加密后数据)
    var passwordRsa = publicEncrypt(base.rsa_public_key,Buffer.from(password)).toString('base64')

    // 然后使用passwordRsa作为密码的参数执行登录接口
    ......
}

三、后端使用私钥解密

1、后端这里也是模拟生成了私钥,然后可以封装个工具类【cryptoRsa.js】用于解密,可以通过返回的结果code,判断解密是否成功(如果不是对应的公钥加密的数据,都会提示解密失败):

javascript 复制代码
const { privateDecrypt } = require('crypto')

// 解密-这里的PrivateKey是模拟生成的私钥
function decryption (data) {
  try {
    const dataDecry = privateDecrypt(PrivateKey, Buffer.from(data.toString('base64'), 'base64'))
    // 返回结果
    return JSON.stringify({
      code: 200,
      data: dataDecry
    })
  } catch (e) {
    // 返回错误
    return JSON.stringify({
      code: 500,
      data: e
    })
  }
}

module.exports = {
  decryption
}

2、后端登录接口,调用工具类进行判断是否解密成功,然后才决定是否执行下一步。

javascript 复制代码
const cryptoRsa = require('../utils/cryptoRsa')
  
function login (pwd) {
  // rsa解密密码
  var rsaCode = JSON.parse(cryptoRsa.decryption(pwd)).code
  var rsaData = JSON.parse(cryptoRsa.decryption(pwd)).data

  // 判断密码是否合法
  if (rsaCode === 200) {
    // 解密后的真实密码
    var password = Buffer.from(rsaData).toString() 

    // 进行密码比对
    ......
  } else {
    // 密码不合法
    ......
  }
}
相关推荐
普通网友43 分钟前
Web前端常用面试题,九年程序人生 工作总结,Web开发必看
前端·程序人生·职场和发展
站在风口的猪11082 小时前
《前端面试题:CSS对浏览器兼容性》
前端·css·html·css3·html5
JohnYan3 小时前
Bun技术评估 - 04 HTTP Client
javascript·后端·bun
shangjg33 小时前
Kafka 的 ISR 机制深度解析:保障数据可靠性的核心防线
java·后端·kafka
青莳吖4 小时前
使用 SseEmitter 实现 Spring Boot 后端的流式传输和前端的数据接收
前端·spring boot·后端
CodeCraft Studio4 小时前
PDF处理控件Aspose.PDF教程:在 C# 中更改 PDF 页面大小
前端·pdf·c#
我的golang之路果然有问题4 小时前
ElasticSearch+Gin+Gorm简单示例
大数据·开发语言·后端·elasticsearch·搜索引擎·golang·gin
拉不动的猪5 小时前
TS常规面试题1
前端·javascript·面试
再学一点就睡5 小时前
实用为王!前端日常工具清单(调试 / 开发 / 协作工具全梳理)
前端·资讯·如何当个好爸爸
穗余5 小时前
NodeJS全栈开发面试题讲解——P5前端能力(React/Vue + API调用)
javascript·vue.js·react.js