1

我听说有人使用这种方法,想知道它的含义是什么。我只知道这是个坏主意!

据我了解,在将哈希存储到数据库之前对密码进行加盐的主要目的是使每个哈希算法都独一无二,因此在尝试破解它时需要为每个用户提供一个新的彩虹表。

如果纯文本只是自己加盐,那么在这种情况下哈希如何被削弱?

一个例子:

plainText = input();
saltedText = plainText + plainText;
hashedText = hash(saltedText);
db.store(hashedText);

以下方法是否具有相同的弱点或任何其他弱点?

plainText = input();
saltedText = hash(plainText) + plainText;
hashedText = hash(saltedText);
db.store(hashedText);
4

3 回答 3

2

我想你误解了盐的用途。盐意味着相同的数据,哈希两次(通常)会给出两个不同的结果。这可以防止攻击,其中知道哪些值可以创建给定的哈希,让您可以登录到使用相同密码的每个人。

因此,除了散列更多数据的性能命中之外,复制要散列的测试不会给您带来任何好处。

于 2010-10-27T11:54:53.147 回答
1

在您的两种方法中,盐都是可预测的,因此只需要一张彩虹表。

每次散列字符串时都应该使用不同的盐:

plainText = input();
salt = getRandomSalt();
hashedText = hash(salt + plainText);
db.store(salt, hashedText);
于 2010-10-27T12:16:06.207 回答
0

其他人已经解释了您的实施问题。

如果您想派生盐(以避免需要存储盐),您需要另一个用户唯一的盐源。

例如,AccountID、用户名或电子邮件地址可以用作盐源。显然,您不应该直接使用源作为盐,而是使用像 PBKDF2 这样的密钥派生函数。

请记住,如果底层盐源更改密码将需要重新散列。这可以通过在更改密钥信息之前询问用户密码来实现(验证用户,然后使用提供的密码重新散列 w/盐源)。

于 2010-11-15T14:55:09.823 回答