nodejs 前后端数据加密方案
前言
即时没有深入研究过密码学,但是对于数据加密,我想应该很多同学都有所接触吧。
虽然对于前端来说,其实数据加密的意义并不大。你代码都给人家了,只要有技术,有耐心,破解就只是时间的问题了。
在对待前端加密的态度上面,我始终秉承着一句话:“防小人,不防君子”。
但是奈何,很多时候,你不想做这么白费心力的事情,但是老板不答应。
我本将心向明月,奈何明月照沟渠。
很多时候,在工作中,都是人在江湖,身不由己!
之前在工作中曾经有这方面的需求,因此稍微研究了下。
如何加密
对于加密的情形,我们需要区分好几种情况,比如是对数据进行加密呢,还是对服务器请求地址的 path 进行加密。
虽然应用的情况不同,但是解决的思路都是大同小异的。
最初级的方案当然是,自己写个简单的加密算法,比如数据是 “1234567890”,我做一个映射,映射到 ‘0987654321’,将顺序打乱,一般就很难看出数据的原格式是什么了,除非别人知道我的映射规则。
上面的加密方案几乎是所有数据加密的基础原理,毫不夸张的说,无出其右。
但是我们的初级方案有一个致命的缺点,它太基础了,我们只是考虑到了数据中数字的情况,但是一旦数据中出现别的字符,比如中文、英文字符、希腊字母,我们上面的映射方法就抓瞎了。
我们当然可以进一步对我们的数据映射规则进行扩充,但是这个构成前人早就给我们做好了,因为我们大可不必自己冲头开始造这么基础的轮子。
这就跟盖房子一样,我们可以从烧制砖块开始干,也可以选择购买成品砖块,加快我们的建造速度。
所以,现在我们应该明白了,加密的关键是要有一套好的加密算法,我们直接拿来用就行了。
常见的加密算法有:DES加密算法、AES加密算法、RSA加密算法、Base64加密算法、MD5加密算法、SHA1加密算法、XXXTEA加密算法等等。
对于这些算法,感兴趣的同学,可以自己查找资料,去深入的学习其原理。
当然,对其我们只需要有个基本的了解就行了,不推荐太过深入,甚至于想自己去实现一套。
有这个研究的想法当然是好的,但是不推荐具体去行动,不仅费时还费心力健壮性还不行,等你研究好了,老板可能就请你打包离开公司了。
况且,前端本身就有非常成熟的开源工具:crypto-js,我们直接拿来用就行了。
对应的 nodejs 后端,当然也可以用这个工具包,但是更好的选择是采用 nodejs 原生支持的 crypto,用法其实也大同小异。
后端(nodejs)
比如我们想采用 aes-128-cbc 加密算法,可以像下面这和么用:
/**
* 加密
* @param {string} data 原文
* @param {string} key CipherKey
* @param {string} iv
*/
const aesEncrypt = (data, key = global._config.secretKey, iv = global._config.secretIv) => {
const cipher = crypto.createCipheriv('aes-128-cbc', key, iv);
let crypted = cipher.