我一直在寻找,我仍然不确定“盐”是什么以及如何使用/实施它。抱歉,这是一个愚蠢的问题,我自学了php。
答案 0 :(得分:43)
我绝对不是专家,但真正简短的回答是“腌制”一行文字意味着在它的末尾加上一些额外的字符。你可以用“abcdefg”盐“盐”来获得“saltabcdefg”。如果“盐”碰巧是您想要更难猜测的密码,这可能会有用。
通常,密码+ salt通过一些难以逆转的过程转换('散列')到一个完全不同的字符串。然后将该变换后的字符串与盐的明文一起存储为密码,并将密码本身的原始纯文本丢弃。如果要检查某人是否输入了正确的密码,请将他们输入的内容与密码文件中列出的盐组合,然后对结果进行哈希处理。如果结果与您记录的密码哈希相匹配,那么您就知道他们输入了正确的密码。
实现一个盐就像拾取一个字符串作为盐一样容易,然后确保你跟踪它。但是,您可以使用每个密码更改盐,然后您必须有一种方法来跟踪密码+盐组合以及生成变体。当然,您可能还想要密码而不是保存密码的纯文本,因此您必须选择哈希函数。此时,问题已经从适当的腌制到实施密码安全方案。
对于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/
答案 1 :(得分:25)
多年前,当我第一次提出这个问题时,有人问我:“盐对食物有什么作用?”答案是它增加了食物的多样性。加密盐背后的想法是,它是您添加到字符串的结尾或开头的内容,以便两个相同的密码不会散列到相同的加密值。
考虑一下 - 如果我有一个非常常见的密码,比如'hello123',然后它与所有其他'hello123'密码完全相同的加密哈希,我不能只查看哈希列表密码,看看谁有相同的加密哈希,并在他们的帐户上使用我的密码?
答案 2 :(得分:6)
好吧,在评论中,谢谢ceejayoz
http://en.wikipedia.org/wiki/Salt_(cryptography)
在您对字符串进行哈希处理之前,您可以添加一个salt,它会为密码添加另一层安全性。
答案 3 :(得分:6)
salt是一个(短)字符串,添加到要加密或散列的字符串中。一个例子:
<?php
$password = 'abcdefg';
$salt = 'anythingyouwant_';
$pw_hash = md5($salt.$password);
?>
这增加了哈希的安全性,因为“anythingyouwant_abcdefg”不太可能已存储在哈希数据库中(http://en.wikipedia.org/wiki/Rainbow_tables)
答案 4 :(得分:0)
出于某种原因。对于刚接触密码学的人来说,盐通常很难掌握。一旦点击,这个概念就非常简单了。看看这篇文章。我认为它比大多数人更好地解释了这个概念。
答案 5 :(得分:0)
让我们通过组合几种哈希算法来做一些事情,制作双哈希算法:
$password = "myPassword";
$salt = sha1(md5($password)).'k32duem01vZsQ2lB8g0s';
$password = md5($password.$salt);
如您所见,我们首先使用双散列算法(md5和sha1)对密码进行哈希处理,并使用密钥创建的salt值进行连接。之后,我们将实际密码与生成的盐值合并,并再次使用md5进行哈希处理。优点是这种方式alt值是随机的,它会发生变化,几乎不可能破坏。我的意思是,如果你可以等待一百万年,手上有一台超级计算机,试着打破它。