什么是SALT以及我如何使用它?

时间:2011-04-07 16:46:21

标签: php salt

我一直在寻找,我仍然不确定“盐”是什么以及如何使用/实施它。抱歉,这是一个愚蠢的问题,我自学了php。

6 个答案:

答案 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)

出于某种原因。对于刚接触密码学的人来说,盐通常很难掌握。一旦点击,这个概念就非常简单了。看看这篇文章。我认为它比大多数人更好地解释了这个概念。

http://cryptodox.com/Salt_%28cryptography%29

答案 5 :(得分:0)

让我们通过组合几种哈希算法来做一些事情,制作双哈希算法:

$password = "myPassword";
$salt = sha1(md5($password)).'k32duem01vZsQ2lB8g0s'; 
$password = md5($password.$salt);

如您所见,我们首先使用双散列算法(md5和sha1)对密码进行哈希处理,并使用密钥创建的salt值进行连接。之后,我们将实际密码与生成的盐值合并,并再次使用md5进行哈希处理。优点是这种方式alt值是随机的,它会发生变化,几乎不可能破坏。我的意思是,如果你可以等待一百万年,手上有一台超级计算机,试着打破它。