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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

© 2021 V2EX