欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

关于Web前端密码加密是否有意义的分析讲解

程序员文章站 2022-07-08 14:00:35
起因:是一个90后团队搞的一个流氓公司,做 Mac 下的盗版应用商场,被骂了一通,同时调侃 http 协议明文传输用户名密码,太低级。后来有个人站出来,提出“前端对数据...

起因:是一个90后团队搞的一个流氓公司,做 Mac 下的盗版应用商场,被骂了一通,同时调侃 http 协议明文传输用户名密码,太低级。后来有个人站出来,提出“前端对数据进行加密没有意义”这个观点。后来就是的骂战了。

无意义说:密码在前端加密完全没有意义,对密码系统的安全性不会有任何提高,反而会引发不必要的麻烦。

(1)加密了也无法解决重放的问题,你发给服务器端的虽然是加密后的数据,但是黑客拦截之后,把加密之后的数据重发一遍,依然是验证通过的。直接监听到你所谓的密文,然后用脚本发起一个http请求就可以登录上去了。

http在网络上是明文传输的,代理和网关都能够看到所有的数据,在同一局域网内也可以被嗅探到,你可以开个wireshark抓下局域网的包试试看。加密也没有提高什么攻击难度,因为攻击者就没必要去解密原始密码,能登录上去就表示目标已经实现了,所以,难度没有提高。

(2)既然是加密,那么加密用的密钥和算法肯定是保存在前端的,攻击者通过查看源码就能得到算法和密钥。除非你是通过做浏览器插件,将算法和密钥封装在插件中,然后加密的时候明文混淆上时间戳,这样即使黑客拦截到了请求数据,进行重放过程时,也会很快失效。

有必要说:

(1)明文传输的是第三方的密码:Apple ID 与密码。因为这个是用户在另一个网站的数据,如果加密之后,虽然攻击者可以通过重放攻击重新进行登录,但是加密情况下无法获取到原始的 Apple ID 的账号和密码。不加密的话如果HTTP请求被拦截的话就可以知道用户的原始密码了,这是一件要不得的事情。于你网站本身来说,这个问题应该不大,因为如果被拦截了,不管怎样拦截者只要查看源码,模拟请求之后都能登陆上。但是因为很多用户目前来说基本上来说不会一个网站一个密码,而是对应着多个账户的。所以如果知道了用户的原始密码,结合社会工程学,能干的事情就挺多了。

(2)加密更安全,不是为了完全阻挡攻击,而是为了提高攻击的成本,降低被攻下的概率。

QQ 网页上的登陆模块(全程HTTP/GET请求):

[javascript]view plaincopy

functiongetEncryption(password,uin,vcode,isMd5){

varstr1=hexchar2bin(isMd5?password:md5(password));

varstr2=md5(str1+uin);

varstr3=md5(str2+vcode.toUpperCase());

returnstr3

}

password:密码

uin:用户名

vcode:验证码

白话就是: md5(md5(md5(密码) + 用户的QQ号) + 验证码)

验证码是一次性的, 所以,在你在网络层拿到本次的请求之后,无法做 重放攻击, 因为验证码是不正确的.加入验证码的作用:防止软件恶意注册,防止暴力破解密码,防止网络爬虫,Google利用验证码,让用户帮他实现图片的识别。

而当你获取新的验证码, 但你并不知道 组合之前的内容[md5(md5(密码) + 用户的QQ号)] 是什么 , 所以你无法重新发送本次请求实现登陆的目的.

至于 服务端的校验, 只要将记录下来的MD5值(而不是记录的明文), 进行同样的运算, 得到的结果与提交上来的一样, 即密码正确.

安全点的方法:通过https协议提交登录数据,这样黑客抓包时得到的数据是加密的,而且无法反解。