总结:
盐可以明文保存,但是更好的解决方案是bcrypt加密和校验。
1
scukmh 2019-12-17 15:41:32 +08:00
$yourSalt$passwordHash$
|
2
shengchen11 2019-12-17 15:43:29 +08:00
有些 salt 就是 username 吧
|
3
CloudMx 2019-12-17 15:43:45 +08:00 2
Bcrypt,可以看看。
|
4
Telegram 2019-12-17 15:45:55 +08:00 via iPhone
对应的盐也存入数据库呗。
|
5
wevsty 2019-12-17 15:50:38 +08:00
salt 可以明文储存在数据库。
Hash 加盐这种做法要保障安全的话,除了 Hash 算法的选择以外也需要盐足够长,一般认为盐的长度应该和密码长度一样长才行。 另外目前是更推荐直接用 BCrypt。 |
6
atom234 2019-12-17 15:51:10 +08:00 1
用现有字符串字段,如果盐不香,可以放点味精、料酒、蚝油之类的
|
7
yisheyuanzhang 2019-12-17 16:00:01 +08:00
推荐 Bcrypt
|
8
cyannnna 2019-12-17 16:02:05 +08:00 via iPad
Bcrypt +10086
|
9
a7217107 2019-12-17 16:03:08 +08:00
bcrypt 不用手动存盐
|
10
php01 2019-12-17 16:09:03 +08:00 1
4 年前流行这做法,现在还用这做法的,可能大部分都是很久没看过新东西的老油条了吧
|
11
qdwang 2019-12-17 16:13:10 +08:00
存在隔壁
|
13
hwdef 2019-12-17 16:40:22 +08:00
aes(md5(key))
|
14
RyougiShiki 2019-12-17 16:57:54 +08:00
django 自带的 admin 注册个用户到数据库表看一下就明白了,同 1 楼回答。
|
15
jorneyr 2019-12-17 17:01:37 +08:00
Bcrypt 的弊端就是效率太低,当大批量从文件导入创建用户,且每个用户的密码还不一样时,非常非常慢
|
16
0TSH60F7J2rVkg8t 2019-12-17 17:06:41 +08:00 via iPhone 1
@jorneyr 这个效率是故意设置的,防止被脱裤后直接拿来跑字典和彩虹表
|
17
ech0x 2019-12-17 17:15:06 +08:00 via iPhone
|
18
ech0x 2019-12-17 17:18:41 +08:00 via iPhone
salthash1 = Bcrypt(password + salt1)
salthash2 = sha512(salthash1 + salt2) 其中 salthash1 不能保存在数据库里 |
19
yisheyuanzhang 2019-12-17 17:21:40 +08:00
@jorneyr Bcrypt 有个参数影响加密效率( GENSALT_DEFAULT_LOG2_ROUNDS = 10 ),为了防止暴力破解
|
20
xuanbg 2019-12-17 17:56:10 +08:00
如果每个数据的盐都不同的话,就加一个字段存起来呀。最简单的是用现成的账号 hash 后做盐,这样就不需要额外字段存了。
|
21
cloudfstrife OP TKS ALL。谢谢各位
|
22
no1xsyzy 2019-12-17 18:41:15 +08:00
话说:
> 每个密码使用的“盐”不同 为什么前面的是 > 如果 啊?难道这不是必须的吗?同盐不还是彩虹表近乎离线破解吗? 只不过特地给你专门做张表罢了。 |
24
PopRain 2019-12-17 18:44:49 +08:00
用户名+密码 作为密码, 就不用加“盐”了吧
|
25
Mutoo 2019-12-17 19:29:28 +08:00
盐是为了对抗彩虹表,可以明文储存。
Bcrypt 是为了对抗暴力破解,增加遍历组合的时间。 |
26
yh7gdiaYW 2019-12-17 23:32:08 +08:00 via Android
之前公司用的是: md5(用户名+md5(密码)+固定的一个字符串)
|
27
zlowly 2019-12-18 00:48:49 +08:00 1
可参见 linux 系统的 /etc/shadow 保存密码的格式
$ID$SALT$ENCRYPTED The $ID indicates the type of encryption, the $SALT is a random (up to 16 characters) string and $ENCRYPTED is a password’s hash. Hash Type ID Hash Length MD5 $1 22 characters SHA-256 $5 43 characters SHA-512 $6 86 characters |
28
conn4575 2019-12-18 01:00:49 +08:00 via Android
bcrypt 还是慎重吧,bcrypt 虽然安全,但是极其消耗 CPU 资源,被攻击时别人可以轻易把你的机器 CPU 打满。
普通的多个 salt 多重 hash 的方式目前来看已经足够安全,别指望单靠一个 bcrypt 就完全解决密码安全问题,有很多安全策略在里面 |
30
k9990009 2019-12-18 07:12:52 +08:00 via Android
把加密后的密码和随机盐按特定的顺序混合存储
|
31
alphatoad 2019-12-18 07:23:54 +08:00 via iPhone
盐可以明文存,加盐的意义是防彩虹表
|
32
jinliming2 2019-12-18 08:26:58 +08:00 via iPhone 1
@conn4575 所以你们服务器的登录服务是可以让攻击者无限尝试不做限制的吗?正常不应该是尝试三次失败出验证码,尝试更多次失败封 IP 的吗?或者增加其他验证机制啊?
|
33
phy25 2019-12-18 08:34:42 +08:00 via Android
可以参考 PHP 的实现: https://www.php.net/manual/en/function.password-hash.php
|
34
shiji 2019-12-18 08:36:15 +08:00
@conn4575 上验证码就好了。验证码没过就不验密码。 网络服务里面比 BCrypt 更浪费 CPU 的有的是。重复这个操作也一样能把 CPU 打满
|
35
jss 2019-12-18 08:39:01 +08:00 via iPhone
你该不是来收集我们的加密规则,干别的事吧…
|
36
jzmws 2019-12-18 08:39:43 +08:00
用 id 做盐
|
39
ryansvn 2019-12-18 09:01:58 +08:00
iCloud 是个谜,我有一次重置手机之后,云端恢复数据,要求我输入锁屏密码,我的锁屏密码从来没有更换过,一直都是同一个,但是无论如何输入,都说不正确,最后搞得只能 DFU 刷机加上设置为新手机不恢复备份,以前东西全部丢失。
后来我就把备份功能关闭了,关键时刻掉链子平时占用空间,这种东西,不用也罢。 |
40
cloudfstrife OP @jss 真心不是啊,主要是考虑到盐如果明文保存,会不会再来安全隐患。如果破解是针对指定用户,而不是针对全量用户的,这种情况,如果盐和密文都泄露了。会有一定的风险。
|
41
Vegetable 2019-12-18 10:39:39 +08:00
明文储存+1
|
42
bluehr 2019-12-18 11:29:23 +08:00
盐是用来防止彩虹表暴力破解的,无需加密存储。
|
43
onice 2020-01-05 12:44:24 +08:00
数据库表新加一个 salt 字段即可。
|
44
nuk 2020-04-28 05:27:59 +08:00
@cloudfstrife 不会啊,不要把 salt 做最终 hash 的一部分, 可以比如这样子
hash=sha(sha(salt+password)+password) |