1. 一个简单的HTML例子看看用户信息安全
<form action = "http://localhost:8080/Application/login" method = "POST"> 用户名:<input id="username" name="username" type="text" /> 密码:<input id="password" name="password" type="password" /> <button type="submit">登陆</button> </form> |
form表单会在提交请求时,会获取form中input标签存在name的属性,作为HTTP请求的body中的参数传递给后台,进行登录校验。
例如我的账号是user1,密码是123456,那么我在提交登录的时候会给后台发送的HTTP请求如下(Chrome或者FireFox开发者工具捕获,需开启Preserve log):
可以发现即便password字段是黑点,但是本机仍以明文的形式截获请求。
2. HTTP协议传输直接暴露用户密码字段

3. 使用加密算法能保证密码安全吗?
对称加密:采用对称密码编码技术,它的特点是文件加密和解密使用相同的密钥加密。
非对称加密:需要两个密钥,公开密钥(publickey)和私有密钥(privatekey)。公开密钥与私有密钥是一对,如果用公开密钥对数据进行加密,只有用对应的私有密钥才能解密;如果用私有密钥对数据进行加密,那么只有用对应的公开密钥才能解密。
3.1 使用对称加密
加密解密在前后台协商后,似乎是个不错的办法,比如,前台使用一个字符串位移+字符串反转的简单方法(举个例子,当然不能这么简单)。那么,如果原密码123456先移位:
123456-->456123
456123-->321654
那么这样简单的方法似乎可以混淆原密码,并且轻松由后台进行相反操作复原。但是这有两个缺点:
前后端加密解密需要同时修改代码; 前端加密无非是写在JS里,但是JS有风险被直接破解从而识别加密方法。
3.2 非对称加密HTTPS就一定是安全的吗?
非对称加密有着公钥私钥的存在,公钥可以随意获取,私钥是用来对公钥解密的本地存储,通过公私钥的机制似乎以保证传输加密并且乃至现在还在使用的HTTPS就是基于这个原理。
HTTPS可以保证传输过程中的信息不被别人截获,但是细细思考下,HTTPS是应用层协议,下层采用SSL保证信息安全,但是在客户端和服务端,密文同样是可以被截获的;
HTTPS报文在传输过程中,如果客户端被恶意引导安装“中间人”的WEB信任证书,那么HTTPS中的“中间人攻击”一样会将明文密码泄露给别人。
4. 结论是,无论HTTP还是HTTPS,密码必须密文传输
保证了用户数据库内部的密码信息安全; 传输过程中无论如何都不会使得用户的密文被破解出原密码; 简单高效,执行以及编码难度都不大,各种语言都提供MD5支持,开发快。
5. 那太好了!这样可以省下HTTPS的钱了,真是这样吗?

这怎么办?其实并不难,有很多种解决方法?其实原理都是类似的:那就是服务器缓存生成随机的验证字段,并发送给客户端,当客户端登录时,把这个一并字段传给服务器,用于校验。
5.1 方案一:验证码
5.2 方案二:token令牌
前后端分离场景。现在非常流行的前后端分离的开发模式大大提高了项目的开发效率。
6. 太不容易了!可是还别高兴的太早,当心数据被篡改
因为即便黑客不登录,不操作,一样要搞破坏:当请求路由到黑客这边的时候,截获数据包,然后也不需要登录,反正账号密码都是对的,token也是对的,那么把数据包的字段改改,搞破坏就可以了。
于是把money改成了1万,再传给服务器,作为受害者就莫名其妙踩了这个坑。可这该怎么解决呢?
其实原理类似于HTTPS里的数字签名机制,首先科普下什么是数字摘要以及数字签名:
6.1 什么是“数字摘要”
6.2 数字签名--水到渠成的技术
7. 总结
问题描述:
如果黑客通过阅读前端js源码,发现加密算法,是否意味他可以构造可以
被服务端解密的checkCode 来欺骗服务端呢 ?
摘要或加密JS算法不直接以静态文件的形式存在浏览器中,而是让WEB端去请求Server,服务器可以根据随机令牌token值决定返回一个相应随机的加密策略,以JS代码响应的方式返回,在异步请求响应中,加载JS摘要算法,这样客户端就可以动态加载数字摘要策略,保证无法仿造。
补充2:MD5存在隐患的问题
感谢园友EtherDream提出MD5已经过时,并且存在不安全的问题:
用MD5、SHA256 处理密码的过时了。。。现在 PBKDF、bcrypt 都在过时中。
本文重点侧重于方法思路的介绍,并不一定是要使用MD5函数,可以使用其他的方式。MD5存在隐患,之前确实没有考虑太多,不过非常感谢园友指出,确实是这样的,主要思想是:
对于MD5的破解,实际上都属于【碰撞】。比如原文A通过MD5可以生成摘要M,我们并不需要把M还原成A,只需要找到原文B,生成同样的摘要M即可。
设MD5的哈希函数是MD5(),那么:
MD5(A) = M
MD5(B) = M
任意一个B即为破解结果。
B有可能等于A,也可能不等于A。
大概意思也就是,截获了MD5加密后的密文,一样可以,找到一个不是原密码,但是加密后可以登陆成功的“伪原文”。有一篇关于MD5风险的博客写的非常好,从中可以看到一点,MD5函数确实能被反向“破解”,但是这个“破解”只是找到一个经过MD5运算后得到相同结果的原文,并非是用户的明文密码。
但是这样会被破解登录的可能,确实是需要采用更完善的算法进行加密,再次感谢!
全部评论