你的数据加密了吗? | 安全与监控(一)前后端加密

191 阅读2分钟

前言

一名正在自由职业的程序员的独立开发之路

说明

安全永远是软件的基石,而http的网络请求,每时每刻都在进行,你肯定不需要自己的接口被别人当爬虫爬取数据把

那作为时时刻刻都在用的用的前后端交互的数据,肯定不能那么简单的看到

我在做我这项目的时候,除了使用https证书之外,还对网络请求的数据做了加密处理

此处记录一下,如果你也用得到,那样最好

流程

主要用到了 对称加密 与 非对称加密的结合

image.png

前端

  1. 先生成 非对称加密的 公钥与私钥
  2. 生成一个随机字符串,作为对称加密的 钥匙AES_key
  3. AES_key 对需要传输的数据Data加密 得到加密之后的数据
  4. 用公钥 对AES_key进行加密,得到加密之后的 AES_key
  5. 将 加密之后的 AES_key 和加密之后 的 Data 传递到 后端

后端

  1. 先用 私钥把 AES_key解密出来
  2. AES_keyData解密出来
  3. 将返回的数据用 AES_key 来加密,返回给前端

前端

  1. 用发送请求的时候的AES_key来直接将 后端返回的数据给解出来

代码如下

# 成功公钥与私钥,直接 在线网站就可以直接生成
http://web.chacuo.net/netrsakeypair

const CryptoJS = require("crypto-js")
const random = require('string-random')
const {JSEncrypt} = require('jsencrypt')

/**
 * RAS 加密(非对称加密)
 * @param {*} content 
 * @returns 
 */
const rasEncrypt = (content)=>{
    var encryptor = new JSEncrypt() // 创建加密对象实例
    //之前ssl生成的公钥,复制的时候要小心不要有空格
    var pubKey = publicKey
    encryptor.setPublicKey(pubKey) //设置公钥
    return encryptor.encrypt(content) // 对内容进行加密
}

// 获取随机数 密码加密的 盐
let getSalt = (num = 30) => {
    return random(num, true)
}
/**
 * 加密 AES 对称加密
 */
const encrypt = (keyAes,data)=>{
    // 随机的AES 钥匙 - 随机数
    let dataAll = {authorization:'',data}
    // 把token放进去
    let token = localStorage.getItem('token')
    if(token) dataAll.Authorization = `Bearer ${token}`
    
    let encryptData = CryptoJS.AES.encrypt(JSON.stringify(dataAll), keyAes).toString()
    return encryptData
}
/**
 * AES 解密
 * @param {*} keyAes 
 * @param {*} encryptData 
 * @returns 
 */
const decrypt = (keyAes,encryptData)=>{
    var bytes  = CryptoJS.AES.decrypt(encryptData, keyAes)
    var decryptedData = JSON.parse(bytes.toString(CryptoJS.enc.Utf8))
    return decryptedData
}

相关链接

生成公钥与私钥

总结

安全非常重要