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