Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/database/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Database 在存储到数据库之前,先隐藏一个秘密,缺点是什么?_Database_Security_Hash_Salt_Rainbowtable - Fatal编程技术网

Database 在存储到数据库之前,先隐藏一个秘密,缺点是什么?

Database 在存储到数据库之前,先隐藏一个秘密,缺点是什么?,database,security,hash,salt,rainbowtable,Database,Security,Hash,Salt,Rainbowtable,我听说过有人使用这种方法,我想知道其含义是什么。我只知道这是个坏主意 据我所知,在将散列存储在数据库中之前添加密码的主要目的是使每个散列算法都是唯一的,因此在尝试破解它时,每个用户都需要一个新的彩虹表 在这种情况下,如果纯文本只是用盐腌制的,散列是如何削弱的 例如: plainText = input(); saltedText = plainText + plainText; hashedText = hash(saltedText); db.store(hashedText); 下面的方法

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

据我所知,在将散列存储在数据库中之前添加密码的主要目的是使每个散列算法都是唯一的,因此在尝试破解它时,每个用户都需要一个新的彩虹表

在这种情况下,如果纯文本只是用盐腌制的,散列是如何削弱的

例如:

plainText = input();
saltedText = plainText + plainText;
hashedText = hash(saltedText);
db.store(hashedText);
下面的方法会有同样的缺点还是其他缺点

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

我想你误解了盐的用途。salt意味着相同的数据经过两次散列(通常)会得到两个不同的结果。这可以防止攻击,因为知道哪些值可以创建给定的哈希,您就可以登录到使用相同密码的所有人


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

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

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

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

其他人已经解释了您的实现中的问题

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

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


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

如果我理解正确的话,您已经解决了第二种方法(散列发生两次)。在第一种方法中,这意味着如果两个密码相同,破解者只需破解其中一个密码即可访问另一个密码。这是一个弱点,我同意,这是很明显的。这是唯一的弱点吗?啊哈,别担心,我现在明白你的意思了。那么,在这种方法中添加盐真的没有意义,是吗?相同的纯文本值总是会产生相同的散列,这就从一开始就消除了盐渍的任何好处。你问这个问题真是太好了,大多数人都懒得去寻找,最终他们的密码和会话密钥使用了一些简单和/或可逆的东西,存在大量的安全漏洞。老实说,我过去只在代码中使用一个常量。从那以后,我学会了使用随机盐,但我仍然看到人们(其中一些人比我更有经验)无缘无故地使用有趣的东西作为盐。很多人认为盐也必须保密。