请教一下关于 password_hash 的密码安全问题

2016-05-29 12:56:10 +08:00
 muziyue
由于 password_hash 只能用 php 验证,那客户端提交是不是用要配合 https 才行
如果没 https 的情况下, js 本地加密一下再 post 给 php 验证这样安全么?没用过这种加密,是不是应该这样用
8765 次点击
所在节点    PHP
43 条回复
hard2reg
2016-05-29 18:09:51 +08:00
@shiny 当有一个可用账号的时候,可以根据社会工程学,把盐给猜出来。。
xqin
2016-05-29 18:10:53 +08:00
@SoloCompany 这么看不起 HTTP? 建议你去研究一下 QQ 网页登陆( http://id.qq.com/login/ptlogin.html).
另外前端的加密是用于解决 HTTP 请求中的数据在被别人获取之后的安全性问题的,
你所假设的 替换公钥, 篡改 HTTP 响应包的数据, 这种问题不是 前端 加密所要解决的事情, 这是 HTTPS 的事.
不能把这两者混为一谈.


@iyaozhen @qqmishi 说拦不住重放的,我也建议你去研究一下 QQ 的网页登陆.


QQ 网页上的登陆,在登陆时的流程如下:
在用户输入完账号之后, 会有一个 ajax 请求, 服务器会根据当前账号的登陆环境等数据, 决定是否要用户输入验证码,
在不需要输入验证码的情况下,服务器会自动返回一个验证码以及 salt.


在登陆时,提交的密码为:(注: QQTea 第一个参数为 key, 第二个参数为 要加密的内容)
RSA(QQTea(md5(QQ 密码 + 验证码) , md5(QQ 密码) + salt + 验证码长度 + 验证码))

验证码是一次性的, 如果对请求进行重放, 这个验证码肯定是不对的, 且你没有腾讯的 私钥,你也解不开这个加密后的内容.

QQTEA 的加密 key 是由用户的密码 和验证码构成了, 而这个密码是只有 用户自己和腾讯知道的.
从截获的 HTTP 请求中,你是找不到这个 KEY 的,所以就更谈不上解密了.


另外再重申一下, HTTP 协议下, 前端加密 是为了保证数据传输过程中在被第三方截获之后,不能破解(直接看到你的密码)/重放等行为的.

拿篡改 HTTP 响应来做为否定 前端 加密必要性, 这两者完全都不是一个层次的, 没有什么可比性.
qqmishi
2016-05-29 18:14:11 +08:00
@xqin 反驳我之前先看看我说的最后一句。
xqin
2016-05-29 18:16:23 +08:00
@qqmishi 你一边说拦不住,一边又说加 token, 我不知道你想表达什么, 所以就 @你一下.
muziyue
2016-05-29 18:30:41 +08:00
好了好了大伙儿别吵了,我也了解差不多了就这样吧
qqmishi
2016-05-29 18:30:46 +08:00
@xqin 我写的“拦不住”指的是只进行加密(比如只对密码进行 md5 加密),这种情况下每次加密结果都是一样的,和明文发送唯一的区别只是无法直接得到明文但依然可以重放。(别笑,我们学校至少有四个系统是用的这种加密方式)
所以我后面加了一句服务端先发送 token 再进行加密。
另外,直接上 HTTPS 省时省力,加密的话需要改写前后端的代码。不能说 HTTP 就是做不到安全传输的,但考虑下成本以及趋势,我依然建议上 HTTPS 。
shiny
2016-05-29 18:39:05 +08:00
除了随机盐值, password_hash 的另一个意义是实现了加密算法和业务逻辑的分离。
hash 中带了加密算法类型,这样不管用什么算法, password_verify 都能验证。

随着 PHP 版本升级,会淘汰不安全的旧算法更换为新算法,这中间甚至不需要修改代码。
cxbig
2016-05-29 18:51:06 +08:00
这年头上 https 不是很容易么? https://letsencrypt.org
JamesRuan
2016-05-29 19:01:53 +08:00
@SoloCompany 前端加密为什么没有意义?
xqin
2016-05-29 19:02:04 +08:00
@qqmishi 是的, 有条件的都建议上 HTTPS :P
现在的 ISP 太流氓了.
strahe
2016-05-29 19:11:17 +08:00
js 本地做的东西都是欺骗自己而已.
kookxiang
2016-05-29 19:34:41 +08:00
password_hash 解决的是密码存储问题, https 解决的是密码传输问题
SoloCompany
2016-05-29 19:36:54 +08:00
@qgy18 只嗅探不改包,那这个中间人真是太良心了,如果真的存在有不可篡改,那么因为密钥可以做到一次有效本来就可以防止重放攻击,通过 df 协议交换密钥甚至连非对称加密都不需要


@xqin 你开心就好
gamexg
2016-05-29 20:10:43 +08:00
你想前端加密,难道后端明文保存密码?
或者后端保存的是和前端同一方式加密的密码?
那样没有意义,破解者直接提交加密后的密码一样玩。
Silicon
2016-05-29 20:53:33 +08:00
@SoloCompany 一般不会“只嗅探不改包”,而是因为“只能”……这种场景下还是没法否定前端加密的存在价值的

但是话说回来,一次性用 HTTPS 解决问题更好啦
Coxxs
2016-05-29 21:07:26 +08:00
能上 https 最好,但是也不是说上就上啊。。
大站上 https 要考虑的东西太多了,肯定是要逐步迁移的。 http 前端散列虽然可以被以各种方式截取,但也不能说没有用。
腾讯就是个例子,前几年腾讯用的就是 http 前端加动态盐的散列,这几年改成了 RSA ,然后再逐步启用 https 。
h4rdy
2016-05-29 21:18:22 +08:00
楼主这样做貌似是为了防范中间人导致的密码泄露?如果是这样的话,直接 post 明文 跟 js 本地加密一下再 post 给 php 验证 都不能有效的防范中间人。直接 post 明文,中间人攻击的时候会抓到明文密码。 js 本地加密一下再 post 给 php 验证 ,虽然抓不到明文密码,但是能抓到 post 包,直接重放攻击就行了。
maxsec
2016-05-30 10:49:15 +08:00
你们都忘记了 password_hash 的初衷。
它不是为了解决中间人啊, JS 加密啊什么鬼的。
他只是为了解决彩虹表+对抗 timing attack 而设定。

以前 md5(xxxx)生成了哈希是唯一且固定的。
现在用 password_hash(xxxx)生成的哈希理论上放大了几亿倍可能。
然后黑客要用彩虹表来对抗 password_hash 加密的密码,基本上不可能了,只能靠穷举。
3dwelcome
2016-05-30 11:56:22 +08:00
@SoloCompany "只嗅探不改包,那这个中间人真是太良心了"

黑客在一个公共 wifi 下,的确只能嗅探,不能改包啊。大量的密码截取,都是基于海量嗅探包来提取的,又不是真的通过实时修改。

JS 加密在目前 HTTP 网站大大多于 HTTPS 的情况下,还是有存在的意义。就如前端都痛恨 xp, 但国内的 XP 普及率还是要让写前端的同学,兼顾一下,不管内心是否愿意。

@xqin 严重支持!
xurubin
2016-05-30 15:32:35 +08:00

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/282008

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX