本文将讲解对于前后端分离的项目,前端注册或登录时如何保证用户密码安全传输到server端,最终存入数据库
为什么需要加密
加密真的有必要吗?
我们先来看一看前端发起的ajax请求中,如果不对密码进行加密,会发生什么。
f12打开chrome开发者工具,找到请求,查看请求参数如下:
如果你的协议是http,那么前端传给后端的密码差不多是裸奔状态,因为http传输的是明文,很可能在传输过程中被窃听,伪装或篡改。
那么,弄个https不就好了吗?
https的确能够极大增加网站的安全性,但是用https得先买证书(也有免费的),对于个人站点或者不想弄证书的情况下,那最起码也得对用户密码进行一下加密吧。
流程图
先看一下大体流程图,首先,我们用工具生成公钥和私钥,将其放入server端,前端发起请求获取公钥,拿到公钥后对密码进行加密,然后将加密后的密码发送到server端,server端将用密钥解密,最后再用sha1加密密码,存入数据库。
生成RSA公钥和密钥
既然选择RSA加密,那么首先得有工具啊,常见的有openssl,但这里不介绍,感兴趣的请自行查阅,对于node而言,我介绍一个不错的库Node-RSA,我们将用它来生成RSA公钥和密钥。
RSA是一种非对称加密算法,即由一个密钥
和一个公钥
构成的密钥对,通过密钥加密,公钥解密,或者通过公钥加密,密钥解密。其中,公钥可以公开,密钥必须保密
。
用Node-RSA生成的公钥和密钥代码如下:
const NodeRSA = require('node-rsa') const fs = require('fs') // Generate new 512bit-length key var key = new NodeRSA({b: 512}) key.setOptions({encryptionScheme: 'pkcs1'}) var privatePem = key.exportKey('pkcs1-private-pem') var publicDer = key.exportKey('pkcs8-public-der') var publicDerStr = publicDer.toString('base64') // 保存返回到前端的公钥 fs.writeFile('./pem/public.pem', publicDerStr, (err) => { if (err) throw err console.log('公钥已保存!') }) // 保存私钥 fs.writeFile('./pem/private.pem', privatePem, (err) => { if (err) throw err console.log('私钥已保存!') })
执行完成后,我们将在根目录下得到公钥和私钥文件:
注意:server端的公钥和密钥应该隔一段时间换一次,比如每次服务器重启时。
前端加密
核心代码如下:
<script src="/UploadFiles/2021-04-02/jsencrypt.min.js">前端将用到jsencrypt对其进行加密,详细用法请参考github。
后端解密
后端核心代码:
const express = require('express'); const crypto = require('crypto'); const fs = require('fs'); var privatePem = fs.readFileSync('./pem/private.pem'); var app = express(); app.use(express.json()); // CORS 注意:要放在处理路由前 function crossDomain(req, res, next) { res.header('Access-Control-Allow-Origin', '*'); res.header('Access-Control-Allow-Headers', 'Content-Type'); next(); } app.use(crossDomain) app.use(function (req, res, next) { // 不加会报错 if (req.method === 'OPTIONS') { res.end('ok') return } switch (req.url) { case '/getPublicKey': let publicPem = fs.readFileSync('./pem/public.pem', 'utf-8') res.json(publicPem) break case '/reg': // 解密 var privateKey = fs.readFileSync('./pem/private.pem', 'utf8') var password = req.body.password var buffer2 = Buffer.from(password, 'base64') var decrypted = crypto.privateDecrypt( { key: privateKey, padding: crypto.constants.RSA_PKCS1_PADDING // 注意这里的常量值要设置为RSA_PKCS1_PADDING }, buffer2 ) console.log(decrypted.toString('utf8')) // sha1加密 var sha1 = crypto.createHash('sha1'); var password = sha1.update(decrypted).digest('hex'); console.log('输入到数据库中的密码是: ', password) // 存入数据库中 // store to db... res.end('reg ok') break } }) app.listen(3000, '127.0.0.1')这里,我是用node自带模块crpto进行解密,当然,你也可以用Node-RSA的方法进行解密。
最后
我们再来看一看前端请求的密码信息:
这样一串字符,即便被他人获取,如果没有密钥,在一定程度上,他是无法知道你的密码的。
当然,关于网络安全是一个大话题,本篇只是对其中的一小部分进行介绍,欢迎留言讨论,希望对您有帮助。,也希望大家多多支持。
免责声明:本站资源来自互联网收集,仅供用于学习和交流,请遵循相关法律法规,本站一切资源不代表本站立场,如有侵权、后门、不妥请联系本站删除!
《魔兽世界》大逃杀!60人新游玩模式《强袭风暴》3月21日上线
暴雪近日发布了《魔兽世界》10.2.6 更新内容,新游玩模式《强袭风暴》即将于3月21 日在亚服上线,届时玩家将前往阿拉希高地展开一场 60 人大逃杀对战。
艾泽拉斯的冒险者已经征服了艾泽拉斯的大地及遥远的彼岸。他们在对抗世界上最致命的敌人时展现出过人的手腕,并且成功阻止终结宇宙等级的威胁。当他们在为即将于《魔兽世界》资料片《地心之战》中来袭的萨拉塔斯势力做战斗准备时,他们还需要在熟悉的阿拉希高地面对一个全新的敌人──那就是彼此。在《巨龙崛起》10.2.6 更新的《强袭风暴》中,玩家将会进入一个全新的海盗主题大逃杀式限时活动,其中包含极高的风险和史诗级的奖励。
《强袭风暴》不是普通的战场,作为一个独立于主游戏之外的活动,玩家可以用大逃杀的风格来体验《魔兽世界》,不分职业、不分装备(除了你在赛局中捡到的),光是技巧和战略的强弱之分就能决定出谁才是能坚持到最后的赢家。本次活动将会开放单人和双人模式,玩家在加入海盗主题的预赛大厅区域前,可以从强袭风暴角色画面新增好友。游玩游戏将可以累计名望轨迹,《巨龙崛起》和《魔兽世界:巫妖王之怒 经典版》的玩家都可以获得奖励。
更新日志
- 中国武警男声合唱团《辉煌之声1天路》[DTS-WAV分轨]
- 紫薇《旧曲新韵》[320K/MP3][175.29MB]
- 紫薇《旧曲新韵》[FLAC/分轨][550.18MB]
- 周深《反深代词》[先听版][320K/MP3][72.71MB]
- 李佳薇.2024-会发光的【黑籁音乐】【FLAC分轨】
- 后弦.2012-很有爱【天浩盛世】【WAV+CUE】
- 林俊吉.2012-将你惜命命【美华】【WAV+CUE】
- 晓雅《分享》DTS-WAV
- 黑鸭子2008-飞歌[首版][WAV+CUE]
- 黄乙玲1989-水泼落地难收回[日本天龙版][WAV+CUE]
- 周深《反深代词》[先听版][FLAC/分轨][310.97MB]
- 姜育恒1984《什么时候·串起又散落》台湾复刻版[WAV+CUE][1G]
- 那英《如今》引进版[WAV+CUE][1G]
- 蔡幸娟.1991-真的让我爱你吗【飞碟】【WAV+CUE】
- 群星.2024-好团圆电视剧原声带【TME】【FLAC分轨】