【发布时间】:2018-06-14 05:08:47
【问题描述】:
我有一个与用户管理相关的非常基本的问题,尤其是存储散列密码。 我读了几页(比如https://wiki.python.org/moin/Md5Passwords)。 我理解散列的方式是这样的:
- 用户提供的密码以一种方式散列(使用任何函数)。
- 没有人(包括用户/管理员)可以看到密码。
- 当用户登录时 - 对他提供的字符串进行哈希处理,以查看它是否与存储的哈希密码匹配。
这一切都很清楚,但是我不确定散列中的“盐”是什么。 我读过 os.urandom (Python) 可以很好地创建好盐: https://crackstation.net/hashing-security.htm
我不确定如何使用这种添加的“盐” 如果我用盐和它的一种方式散列用户密码。下次用户登录时,他只知道密码而不知道盐。据此,我假设为该用户生成的“盐”需要存储在某个地方。否则就没有意义了。但另一方面,如果有人可以访问数据库,那么将看到“salt”和散列密码。在这种情况下,“盐”不会增加太多价值(它与散列纯密码几乎相同)。所以也许“盐”只是为了防止前端保护(反对蛮力)。
有人可以告诉我如何使用盐吗?我的理解是否正确。我需要在某处储存“盐”吗?
在我发布这个问题之前,我发现了这个: Should the Salt for a password Hash be "hashed" also?
盐的附加值是多少? 如果我编写 Web 服务,我可以在 3 次尝试失败后阻止每次登录。 前端没有人能够看到散列值。没有人可以使用蛮力(这可能只是 DoS,因为 3 次登录失败会阻止用户)。黑客需要访问数据库并查看散列密码。但如果他有,他会看到“盐”。
【问题讨论】:
-
盐也存储在数据库中。
-
使用盐之所以有用,是为了防止黑客使用预先计算的哈希值。例如,很容易获得前 100,000 个使用过的密码以及 md5 哈希值的列表。
-
MD5 坏了。无论有无盐,您都不能将其用于密码哈希。
-
@rdr:通常散列的想法是防止具有访问数据库的黑客窃取密码。
-
@rdr 盐阻止了彩虹表的使用。 (简而言之,如果
password哈希为12345,那么攻击者只需检查被盗数据库中的哈希12345并在不使用盐时立即知道密码。但如果使用盐,那么存储的哈希值为passwordSALTSALTSALT,攻击者无法猜到(如果每个人都使用不同的盐)。)