登录接口,密码这种重要信息不可以用明文传输,必须加密处理。
这里就可以使用RSA非对称加密,后端生成公钥和私钥。
公钥:给前端,公钥可以暴露出来,没有影响,因为公钥加密的数据只有私钥才能解密。
私钥:留在后端,用于解密。

node可以直接使用【crypto】模块,利用如下代码即可完成公钥和私钥的生成,和数据的加解密,代码均有注释:
- 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加密很简单,这里模拟下获得后端的公钥,然后加密密码
- 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,判断解密是否成功(如果不是对应的公钥加密的数据,都会提示解密失败):
- 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、后端登录接口,调用工具类进行判断是否解密成功,然后才决定是否执行下一步。
- 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 {
- // 密码不合法
- ......
- }
- }
