前言
一名正在自由职业的程序员的独立开发之路
说明
安全永远是软件的基石,而http的网络请求,每时每刻都在进行,你肯定不需要自己的接口被别人当爬虫爬取数据把
那作为时时刻刻都在用的用的前后端交互的数据,肯定不能那么简单的看到
我在做我这项目的时候,除了使用https证书之外,还对网络请求的数据做了加密处理
此处记录一下,如果你也用得到,那样最好
流程
主要用到了 对称加密 与 非对称加密的结合
前端
- 先生成 非对称加密的 公钥与私钥
- 生成一个随机字符串,作为对称加密的 钥匙
AES_key - 用
AES_key对需要传输的数据Data加密 得到加密之后的数据 - 用公钥 对
AES_key进行加密,得到加密之后的AES_key - 将 加密之后的
AES_key和加密之后 的Data传递到 后端
后端
- 先用 私钥把
AES_key解密出来 - 用
AES_key把Data解密出来 - 将返回的数据用
AES_key来加密,返回给前端
前端
- 用发送请求的时候的
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
}
相关链接
总结
安全非常重要