本篇文章为大家展示了怎么在节点中对密码进行加密,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。
<强>为什么需要加密强>
加密真的有必要吗?
我们先来看一看前端发起的ajax请求中,如果不对密码进行加密,会发生什么。
f12打开铬开发者工具,找到请求,查看请求参数如下:
如果你的协议是http,那么前端传给后端的密码差不多是裸奔状态,因为http传输的是明文,很可能在传输过程中被窃听,伪装或篡改。
那么,弄个https不就好了吗?
https的确能够极大增加网站的安全性,但是用https得先买证书(也有免费的),对于个人站点或者不想弄证书的情况下,那最起码也得对用户密码进行一下加密吧。
<>强流程图强>
先看一下大体流程图,首先,我们用工具生成公钥和私钥,将其放入服务器端,前端发起请求获取公钥,拿到公钥后对密码进行加密,然后将加密后的密码发送到服务器端,服务器端将用密钥解密,最后再用sha1加密密码,存入数据库。
<强>生成RSA公钥和密钥强>
既然选择RSA加密,那么首先得有工具啊,常见的有openssl,但这里不介绍,感兴趣的请自行查阅,对于节点而言,我介绍一个不错的库Node-RSA,我们将用它来生成RSA公钥和密钥。
RSA是一种非对称加密算法,即由一个<代码>密钥> 代码和一个<代码>公钥代码>构成的密钥对,通过密钥加密,公钥解密,或者通过公钥加密,密钥解密,其中,公钥可以公开,<代码>密钥必须保密> 代码。
用Node-RSA生成的公钥和密钥代码如下:
const NodeRSA =,需要(& # 39;node-rsa& # 39;) const fs =,要求(& # 39;fs # 39;)//,Generate new 512 bit-length 关键 var key =, new NodeRSA ({, 512}) key.setOptions ({encryptionScheme: & # 39; pkcs1& # 39;}) var privatePem =, key.exportKey (& # 39; pkcs1-private-pem& # 39;) var publicDer =, key.exportKey (& # 39; pkcs8-public-der& # 39;) var publicDerStr =, publicDer.toString (& # 39; base64 # 39;)//,保存返回到前端的公钥 fs.writeFile (& # 39;。/pem public.pem& # 39;,, publicDerStr,, (err),=祝辞,{ ,if (错),throw 犯错 ,console.log(& # 39;公钥已保存! & # 39;) })//,保存私钥 fs.writeFile (& # 39;。/pem private.pem& # 39;,, privatePem,, (err),=祝辞,{ ,if (错),throw 犯错 ,console.log(& # 39;私钥已保存! & # 39;) })
执行完成后,我们将在根目录下得到公钥和私钥文件:
注意:服务器端的公钥和密钥应该隔一段时间换一次,比如每次服务器重启时。
<强>前端加密强>
核心代码如下:
, & lt; script src=癶ttps://cdn.bootcss.com/jsencrypt/2.3.1/jsencrypt.min.js"祝辞& lt;/script> ,& lt; script  src=癶ttps://cdn.bootcss.com/axios/0.18.0/axios.min.js"祝辞& lt;/script> ,& lt; script> function 才能注册(),{ ,,axios ({ ,,,方法:,& # 39;文章# 39; ,,,url:, & # 39; http://127.0.0.1:3000 getPublicKey& # 39; ,,}) ,,,不要犹豫(res =祝辞,{ ,,,,let result =res.data ,,,,//,从后端获取的公钥,字符串 ,,,,var publicPem =结果 ,,,,//,用JSEncrypt对密码进行加密 ,,,,var encrypt =, new JSEncrypt () ,,,,encrypt.setPublicKey (publicPem) ,,,,var password =, & # 39; abc123 # 39; ,,,,password =, encrypt.encrypt(密码) ,,,,axios ({ ,,,,,方法:,& # 39;文章# 39; ,,,,,url:, & # 39; http://127.0.0.1:3000/reg # 39; ,,,,,数据:,{ ,,,,,,密码:密码 ,,,,,} ,,,,}) ,,,,,不要犹豫(res =祝辞,{ ,,,,,,let result =res.data ,,,,,,console.log(结果) ,,,,,}) ,,,,,.catch (error =祝辞,{ ,,,,,,console.log(错误) ,,,,,}) ,,,}) ,,} ,& lt;/script>
前端将用到jsencrypt对其进行加密,详细用法请参考github。
<强>后端解密强>
后端核心代码: