在我拥有的一个项目中,我目前正在用 3 种盐对密码进行加盐...
- 静态盐 - 硬编码到源代码中。
- 随机生成的盐(使用为生成密码盐而设计的函数)。这存储在 MySQL 数据库中。
- 未存储的随机数。
在检查散列时,我使用静态盐、存储在数据库中的盐和可能的随机数之一生成 100 个不同的散列,如果其中一个匹配密码是正确的。
顺便说一句,我正在使用 sha512。
这是哈希密码的安全方法吗?
谢谢!
在我拥有的一个项目中,我目前正在用 3 种盐对密码进行加盐...
在检查散列时,我使用静态盐、存储在数据库中的盐和可能的随机数之一生成 100 个不同的散列,如果其中一个匹配密码是正确的。
顺便说一句,我正在使用 sha512。
这是哈希密码的安全方法吗?
谢谢!
这是哈希密码的安全方法吗?
可能,但是您的许多额外复杂性并没有真正增加太多安全价值。
盐的想法是确保没有比从头开始暴力破解每个密码更有效的方法来恢复您的密码。因此,您的目标是确保没有两个帐户具有相同的盐(即它是全球唯一的)。如果他们这样做了,那么攻击者基本上可以通过构造一个查找表而以一个价格获得两个,同时暴力破解第一个。
为了实现这一点,您需要在您的盐中具有足够的熵,以确保两个帐户具有相同盐的概率可以忽略不计。
随机生成的盐(使用为生成密码盐而设计的函数)。这存储在 MySQL 数据库中。
这是您的方案中熵的主要来源。您可能会丢弃其余部分而不会显着影响安全性。
但是,要使这种盐有效,您必须确保:
静态盐 - 硬编码到源代码中。
这增加了最小的加密价值。从理论的角度来看,假设攻击者知道该值,它不会增加任何额外的熵,而从实际的角度来看,数据库服务器通常是通过从受感染的应用程序中获取的凭据来破坏的。
顺便说一句,我正在使用 sha512。
虽然这是一种加密安全的散列算法,但它也是一种“快速”算法,这是一个问题,因为用户通常使用弱密码。您应该考虑使用慢速散列算法(例如 bcrypt)或将散列过程迭代 10k 次左右。如果计算每个哈希需要一秒钟左右,那么即使是字典攻击也需要很长时间。
在检查散列时,我使用静态盐、存储在数据库中的盐和可能的随机数之一生成 100 个不同的散列,如果其中一个匹配密码是正确的。
这个值是最小的,你基本上只是在密码中添加一两个额外的字符,然后每次都强制使用它们。这会减慢你的散列方案,这很好,但你最好使用上面的技术来实现这一点。