小白不懂就问大佬,后端在实现登录验证用户名和密码时,是用户名+密码的 hash 值去查库看是否有结果呢?还是只使用用户名查记录,然后拿结果的密码 hash 在程序中同提交的密码的进行比对呢?

2019-12-19 14:31:20 +08:00
 paullee
如题
google 搜索半天,估计是关键词没找对,没搜到相关的讨论,故来此伸手问问大佬们。
1932 次点击
所在节点    问与答
14 条回复
littleylv
2019-12-19 14:33:30 +08:00
我用 2。
我也觉得该用 2。
gamexg
2019-12-19 14:38:51 +08:00
2

为了对抗彩虹表,一般 hash 密码时会加随机盐(参考 BCrypt ),不方便使用方法 1。
另外随着项目延续,密码加密方式可能变更,1 也不方便使用。
paullee
2019-12-19 14:55:51 +08:00
@gamexg
@littleylv 谢谢大佬指点
ThirdFlame
2019-12-19 15:10:35 +08:00
注意 不管是没有查到这个用户 还是 密码不对。 给用户的返回提示应都为“用户名或密码错误”
避免被枚举用户
netnr
2019-12-19 15:32:19 +08:00
我常用第一种方式
mxT52CRuqR6o5
2019-12-19 18:01:13 +08:00
怎么看都是 1 更安全啊,你可以看看开源的项目都是怎么写的,我也没看出加盐哪里会不方便用方法 1
qingzhan
2019-12-19 18:28:07 +08:00
突然问出了心中疑惑,以前用二,现在公司用一,到底哪种好?
woodensail
2019-12-19 18:32:46 +08:00
用户名单独传。
密码方面,每次登录时由服务器生成一个一次性 token,然后该 token+密码一起 hash,然后传到服务端,服务端用存在 session 里面的 token 重复该步骤进行比较。
这种方案的好处在于可以避免重放攻击,就算被第三方窃取到了 hash 结果也没事,下一次的 hash 肯定不一样。
Depth
2019-12-19 18:38:37 +08:00
很简单呀,从你提的 2 中场景来看,第一种好,但是如果你的第二中情况加盐值了,那就第二种好,因为你的第一种相当于一个固定盐了
哈希(密码 加 随机盐) > 哈希(密码+固定盐) > 哈希(密码)
luckyrayyy
2019-12-19 18:52:05 +08:00
从 Spring Security 的思想来看应该是 2,因为他默认的加密方式得到的密码是带有随机盐的,每次都不一样。
wdkty
2019-12-19 18:55:53 +08:00
存储在数据库里面的是 hash(salt&password)还是 salt&hash(password)?
eason1874
2019-12-19 19:52:45 +08:00
@mxT52CRuqR6o5 #6 方法 1 只适合固定盐,如果你按高标准加盐让每个密码都有足够长的随机盐,那方法 1 就不方便。

因为你每次校验都要有用户的 salt,既然都把 salt 查出来了那干嘛不把 hash 一起查出来,这样只要查一次,按方法 1 要查两次。
DavidNineRoc
2019-12-19 20:05:29 +08:00
更倾向于第二种,现在很多哈希都把盐存到加密字符串了。 之后每次的盐都不一样,只能 check 出来,不能比对
paullee
2019-12-20 09:52:31 +08:00
@wdkty 目前暂对密码简单 md5 了一手🤦‍♂️。
看完各位大佬的留言,我需要再去补补密码加盐(固定盐 /随机盐)的知识,之前尚未考虑到这点。

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

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

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

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

© 2021 V2EX