登录接口明文密码在浏览器端先加盐 SHA512 一次,服务端再用 bcrypt 等慢哈希算法二次加密存储是最佳实践吗?为什么多个大厂都发生过不小心在日志输出用户明文密码的事件,不加密或可逆加密传输用户密码仍是主流

6 天前
 drymonfidelia
加盐 SHA512 这种方案反而我基本没见过
如果是为了检测是否是泄露的或者是弱密码,那可以把常用密码数据库同样加盐 SHA512 一次再保存(不过这样就要求 SHA512 的盐全部用户相同)或者把 1000 个常见密码发到客户端,在客户端判断
还有一种方案是 Scrypt KDF 以前在 discord 上看到有人讨论过,有实际应用案例吗
4592 次点击
所在节点    信息安全
56 条回复
loading
6 天前
我有个项目就是的在前端加盐 hash 后给后端的,密码强度验证就只在前端,后端只收到 hash 结果。
shunia
6 天前
前端加密也好,hash 也好,作用是什么?完全没看懂。

我只能想到一个作用,就是拿这个特定的用户名和密码组合来做碰撞攻击其他服务/工具。
shenjinpeng
6 天前
服务器端有一百种方式泄露用户密码, 例如 nginx 日志, 网关层, 框架日志, 接口请求记录, 中间各层 HTTP 请求,RPC 请求 ... 不管怎么样, 从服务器接收到请求开始,再到用户中心给密码加密之前, 所有中间层能可以明文看到用户密码 .
zzsong
6 天前
没明白前端 hash 的意义在哪,对与服务端而言密码不就变成了前端 hash 后的值了吗?非但没有提升安全性,反而增加了碰撞的可能性。
catamaran
6 天前
1. 谈不上最佳实践,bcrypt 加密没啥争议,java 的主流做法。至于浏览器端加密,满足客户要求就好,最多的场景就是浏览器提交的密码不是明文就行。浏览器端加密本身争议就比较大,没必要非得求个定论。
2. 密码泄漏我有印象的,一个是 csdn 被拖库,因为用明文存储的,另外一个是阿里云的事情,细节不记得了,原因是把 secretkey 写到了代码里,然后传到了 github 上。没听说过日志泄漏的。这种只能说开发也太没有安全意识了,敏感信息不该进日志。
catamaran
6 天前
@shenjinpeng 都能进入中间层了,明文密文还有意义吗?反正后端认就能利用。
Building
6 天前
第一 https 都被挟持了你做再多的加密都没用了
第二密码可以携带多重信息的,比如可以在密码后面加验证码可以让老版本没有验证框的也能登陆
nekoneko
6 天前
其实没意义. 前端明文 + https + bcrypt 即可. 至于 https 被劫持和 后端流程泄漏密码, 这是另外的问题.
restkhz
6 天前
有很多人说前端 hash 是为了防止服务器沦陷,比如服务器流量干脆被劫持,TLS 证书被盗。
“服务端不可信任!”
但是如果是 web 的话,入站流量里的密码能被劫持所以你 hash 了用户密码,思路 OK 。
但是如果服务器已经沦陷,别人不能直接改你出站流量里前端 js 脚本吗?直接去掉 js 里 hash 步骤让用户明文提交,或者干脆就钓鱼,咋办?
或许你做的是 APP 的 API 吧,不从服务器接收认证逻辑,我不否认这是一种纵深防御思想...

我对此的态度是,反正没有太大收益,只要不怎么增加复杂性,开心就好。

因为信任 TLS ,信任服务端。我想这就是不 hash 提交密码的原因。
否则服务端若不可信任,你大概要再做一套认证+加密,几乎就是再发明一个 TLS 了。

所以我也不太清楚,TLS 后,前端流量还要加密一下的意义有多大,我见过有用 AES 的(对,还不是非对称),甚至比前端 TLS+hash 还难理解它的意义。

不恰当的比喻:TLS 都能被攻破的情况下,你再加一层凯撒位移不会更安全。
制造无意义的信任边界,过度设计只会让事情变得复杂,增加成本,甚至可能更不安全。

btw ,什么是“可逆加密”?不可逆的加密是加密吗?(小声)
lambdaq
6 天前
明文密码不一定是泄漏,还可能是试出来的。
ala2008
6 天前
我们会对敏感数据做非对称加密再传输
Hozoy
6 天前
Google 登录至今还是传输的明文密码,Twitter 也发生过明文密码记录到 log 的安全事故。所以明文传输密码本身并没有什么问题,只要后续链路存储规范即可。
ladypxy
6 天前
@superrichman 你服务器都能泄密了,你啥加密都没意义了
superrichman
6 天前
@yb2313 盐即使泄露,问题通常也不大。盐的主要目标是防止相同密码产生相同哈希,以及抵御彩虹表攻击。只要每个用户、每条记录的盐都不同,这样即使攻击者拿到所有盐和哈希,也不能用一个统一的预计算表(彩虹表)去快速破解。

@ladypxy 服务器泄密,接收的和存储的是哈希过的信息,不会泄露原始信息,怎么会没有意义。

加密/哈希的意义就是“把泄露变得不等于彻底泄露”,降低风险,增加攻击者成本。
yulon
6 天前
楼上那么多人连 hash 不是加密都不知道,笑不活了。

难得 LZ 那么有责任心来问一下,结果钓出那么多卧龙凤雏。

明文密码泄漏,是怕你用密码拿去尝试登陆别的网站,不只是泄漏密码的这一家网站的事情。
irrigate2554
6 天前
用密码管理器的表示没关系,你安全做的不好泄漏也影响不到我其它网站
ZhiyuanLin
6 天前
这个问题叫 ZKPP ( zero-knowledge password proof ),已经有非常成熟的方案例如楼上提到的 SRP ,PAKE 。
码农不要自己用半吊子的密码学知识拍脑袋想方案,真要安全就用已经标准化的 scheme 。
不过互联网企业大部分属于是能 hash 一下已经是业界领先的水平。
BaiLinfeng
6 天前
我怎么没看懂这是在说啥哦
ladypxy
6 天前
@superrichman 服务器泄密,接收的和存储的是哈希过的信息。你服务器登录啥的用的都是哈希过的信息了,不是院士信息,那你这些信息泄漏了别人完全可以伪造登录了。那你的意义在哪里?
way2create
6 天前
@yulon 没什么别的意思 单纯好奇一下 你说的楼上那么多人是谁呢 我咋没看到有很多 求科普
除了一个说 bcrypt 加密的 很多 v 友提到加密不都是针对 op 最后一句话问的“为什么不加密传输仍是主流”回的吗

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

https://ex.noerr.eu.org/t/1157900

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

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

© 2021 V2EX