怎么在节点中对密码进行加密

  介绍

本篇文章为大家展示了怎么在节点中对密码进行加密,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。

<强>为什么需要加密

加密真的有必要吗?

我们先来看一看前端发起的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。

<强>后端解密

后端核心代码:

怎么在节点中对密码进行加密