在存储到数据库之前自己保密,有哪些缺点?

时间:2010-10-27 11:45:37

标签: database security hash salt rainbowtable

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

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

如果纯文本只是自己腌制,那么在此上下文中哈希是如何被削弱的?

一个例子:

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

以下方法会有相同的弱点或任何其他弱点吗?

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

3 个答案:

答案 0 :(得分:2)

我认为你误解了盐的目的。盐意味着相同的数据,两次散列会(通常)给出两种不同的结果。这可以防止在知道哪些值可以创建给定哈希值的情况下进行攻击,从而为使用相同密码的每个人提供登录。

因此,复制要进行哈希测试的测试除了散列更多数据之外,不会给你任何好处。

答案 1 :(得分:1)

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

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

plainText = input();
salt = getRandomSalt();
hashedText = hash(salt + plainText);
db.store(salt, hashedText);

答案 2 :(得分:0)

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

如果你想得到一个盐(为了避免需要存储盐),你需要另一个用户唯一的盐源。

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

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