什么是盐和我如何使用它?
我一直在四处寻找,我仍然不确定“盐”是什么,以及如何使用/实施它。 对不起,没有问题,我自学PHP。
我绝对不是专家,但真正简短的答案是,“腌制”一行文本意味着在其末尾添加一些额外的字符。 你可以用“abcdefg”将盐“盐”得到“saltabcdefg”。 如果“salt”碰巧是一个你想要猜测的密码,这可能是有用的。
通常,密码+ salt被一些难以逆向处理转换('散列')为完全不同的string。 然后将这个转换后的string作为密码和盐的明文一起存储起来,并丢弃密码本身的原始纯文本。 当你想检查某个人是否input了正确的密码时,你可以将他们input的内容与密码文件中列出的salt结合起来,然后对结果进行散列。 如果结果与您logging的密码哈希匹配,那么您知道他们已经input了正确的密码。
实现一个盐可以很容易地select一个string作为盐,然后确保你跟踪它。 但是,你可以改变每个密码的盐,然后你必须有一个方法来跟踪密码+盐组合,以及生成的变化。 当然,你可能也想散列密码而不是保存密码的纯文本,所以你必须select一个散列函数。 在这一点上,问题是从妥善执行密码安全scheme开始的。
对于PHP,你可能想看看一些框架是如何实现的。 两个快速链接,分别为CakePHP和Zend:
http://www.jotlab.com/2010/04/18/cakephp-rainbow-table-protection-behaviour/
http://www.zimuel.it/blog/2009/07/build-a-secure-login-with-zend-framework/
当我多年前第一次问到这个问题时,我被问到“食盐是做什么的? 答案是它增加了食物的多样性。 密码盐背后的想法是,它添加到string的末尾或开头,以便两个相同的密码不会哈希到相同的encryption值。
考虑一下 – 如果我有一个非常常见的密码,比如“hello123”,然后它和所有其他的“hello123”密码散列到完全相同的encryption散列,我不能只看哈希密码列表来看还有谁有相同的encryption散列,并使用我的密码在他们的帐户?
salt是一个(短)string,它被添加到要encryption或散列的string中。 一个例子:
<?php $password = 'abcdefg'; $salt = 'anythingyouwant_'; $pw_hash = md5($salt.$password); ?>
这增加了散列的安全性,因为“anythingyouwant_abcdefg”不太可能存储在散列数据库中( http://en.wikipedia.org/wiki/Rainbow_tables )
那么在评论中,谢谢ceejayoz
http://en.wikipedia.org/wiki/Salt_(cryptography);
盐是你在散列之前添加到string中的东西,它为密码等增加了另一层安全性。
因为某些原因。 对于密码学新手来说,盐通常很难掌握。 一旦它点击,这个概念是非常简单的。 看看这篇文章。 我认为这比大多数人更好地解释这个概念。
让我们通过结合几种散列algorithm来加深一点,做一个双重哈希algorithm:
$password = "myPassword"; $salt = sha1(md5($password)).'k32duem01vZsQ2lB8g0s'; $password = md5($password.$salt);
正如您所看到的,我们首先使用双散列algorithm(md5和sha1)对密码进行哈希处理,然后与密钥创build的盐值进行连接。 之后,我们将真正的密码与生成的salt值相结合,并用md5再次散列。 这样做的好处是,这种方式的价值是随机的,它变化,几乎不可能打破。 我的意思是,如果你可以等待一百万年,并且拥有一台超级计算机,那就试着打破它。