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


    背景

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

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

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

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

    实现

     一、后端生成公钥私钥

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

    1. const { generateKeyPairSync } = require('crypto')
    2. const { publicEncrypt, privateDecrypt } = require('crypto')
    3. // 配置
    4. const { publicKey, privateKey } = generateKeyPairSync('rsa', {
    5. modulusLength: 1024,
    6. publicKeyEncoding: {
    7. type: 'spki',
    8. format: 'pem'
    9. },
    10. privateKeyEncoding: {
    11. type: 'pkcs8',
    12. format: 'pem'
    13. }
    14. })
    15. // 生成密钥
    16. const pub = publicKey.toString()
    17. const pri = privateKey.toString()
    18. console.log('---------------公钥--------------\n' + pub)
    19. console.log('---------------私钥--------------\n' + pri)
    20. // 需要加密的数据
    21. const data = 'hello world'
    22. // 公钥加密
    23. const encryptData = publicEncrypt(pub, Buffer.from(data)).toString('base64')
    24. console.log('加密后:', encryptData)
    25. // 私钥解密
    26. const decryptData = privateDecrypt(pri, Buffer.from(encryptData.toString('base64'), 'base64'))
    27. console.log('解密后:', decryptData.toString())

    效果如下:

    公钥:

    私钥:

    加解密情况:

    二、前端使用公钥加密

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

    1. import {publicEncrypt} from 'crypto'
    2. function login (password) {
    3. // 密码rsa公钥加密(password是密码原文,passwordRsa为加密后数据)
    4. var passwordRsa = publicEncrypt(base.rsa_public_key,Buffer.from(password)).toString('base64')
    5. // 然后使用passwordRsa作为密码的参数执行登录接口
    6. ......
    7. }

    三、后端使用私钥解密 

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

    1. const { privateDecrypt } = require('crypto')
    2. // 解密-这里的PrivateKey是模拟生成的私钥
    3. function decryption (data) {
    4. try {
    5. const dataDecry = privateDecrypt(PrivateKey, Buffer.from(data.toString('base64'), 'base64'))
    6. // 返回结果
    7. return JSON.stringify({
    8. code: 200,
    9. data: dataDecry
    10. })
    11. } catch (e) {
    12. // 返回错误
    13. return JSON.stringify({
    14. code: 500,
    15. data: e
    16. })
    17. }
    18. }
    19. module.exports = {
    20. decryption
    21. }

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

    1. const cryptoRsa = require('../utils/cryptoRsa')
    2. function login (pwd) {
    3. // rsa解密密码
    4. var rsaCode = JSON.parse(cryptoRsa.decryption(pwd)).code
    5. var rsaData = JSON.parse(cryptoRsa.decryption(pwd)).data
    6. // 判断密码是否合法
    7. if (rsaCode === 200) {
    8. // 解密后的真实密码
    9. var password = Buffer.from(rsaData).toString()
    10. // 进行密码比对
    11. ......
    12. } else {
    13. // 密码不合法
    14. ......
    15. }
    16. }

  • 相关阅读:
    模拟器连不上AndroidStudio的处理方案
    基于leetcode的算法训练:Day3
    广东电信和中兴开通首个50G PON万兆入企啦!
    mybatis-plus 基本CRUD
    安卓APP源码和设计报告——基于Android的垃圾分类系统
    干货 | 人力资源数字化的优势和应用场景展示
    XShell与XFtp的安装及简单使用
    Java 中的 String Pool 简介
    鸿鹄工程项目管理系统em Spring Cloud+Spring Boot+前后端分离构建工程项目管理系统
    LeetCode - Medium - 62. Unique Paths
  • 原文地址:https://blog.csdn.net/weixin_42966151/article/details/137962738