散列函数和保持密码保护

时间:2012-01-13 03:21:48

标签: php md5 hash sha1 crc32

我一直想知道很多关于不同形式的哈希和密码的问题。是的,我知道有关盐析,可能会添加到哈希,但这没有任何腌制。我可能会使用动态腌制技术。

除了所有这些之外,我想知道下面显示的内容是否合乎逻辑?

<?php

$data = "David";
$hash_crc32 = crc32($data);
$hash_md5 = md5($data);
$hash_sha1 = sha1($data);
echo '<br /><br />' .$hash_crc32. '<br /><br />' .$hash_md5. '<br /><br />' .$hash_sha1;

?>

Echo输出以下内容:

1180170431

464e07afc9e46359fb480839150595c5

d27937f914ebe99ee315f04449678eccfb658191

$hash_crc32_md5 = $hash_md5 + $hash_crc32 + $hash_sha1 . $hash_md5 . $hash_crc32 . $hash_sha1;

<?php echo '<br /><br />' .$hash_crc32_md5; ?>

Echo输出:

5820170431464e07afc9e46359fb480839150595c51180170431d27937f914ebe99ee315f04449678eccfb658191

所以你认为像这样对密码进行哈希会过度杀人吗?我应该坚持使用盐腌一种形式的散列吗?我知道我不可能是第一个想到这样的东西,因为它看起来非常明显。

您认为使用此表单在哈希冲突等方面遇到多大困难?

感谢您的回复! :)

2 个答案:

答案 0 :(得分:4)

有点矫枉过正吗?我无法对此发表评论。我声明它可能较少安全,而不是只使用其中一种方法(就信息理论而言)。

原因是您实际上通过提供多个哈希算法的结果向未来的黑客提供更多信息。

对于这些散列方法中使用的算法,没有任何秘密。 Hashing通过这样一个事实来移除信息:虽然它是可逆的,但是有大量可能的文本可以产生相同的散列。

但是,在提供多个哈希输出时,您可以有效地删除许多这些可能性,因为,例如,可以生成特定MD5的文本数量与生成特定SHAx的文本相交

根据你拥有的MD5哈希来思考。也许有一万亿种不同的文本可以产生这种价值。这是一个非常大的搜索空间。

现在考虑SHAx哈希。可能还有一万亿种不同的文本可以产生它。再次是一个庞大的搜索空间。

但是,如果这两个搜索空间的相交是四十二个不同的文本,那就不会花费很长时间。

密码学不适合胆小的人,也不适合那些没有在该领域获得博士学位的人: - )

答案 1 :(得分:1)

散列密码的要点是,您仍然可以通过散列明文密码来验证密码,就像您第一次散列密码一样,然后将其与存储的散列进行比较,而无法反转将值转换为明文形式。从这个意义上说,你所做的事情并没有带走任何东西。

哈希的弱点主要有两个方面:如果通过所有可能的密码相对便宜,可以对哈希进行暴力破解,哈希并将它们与存储的哈希进行比较。从这个意义上说,你的技术增加了一点点安全性,因为你的三重哈希值比一个普通哈希需要更长的时间来计算,所以攻击者需要更多的时间来尝试所有的组合。但这并不重要。实现这一目标的更好方法是使用较慢的哈希算法和/或简单地重复哈希操作一定次数(100-1000 +次)。

另一个缺点是彩虹表,有人已经遇到了创建一个将所有可能的密码映射到其散列值的表的麻烦。您的技术在这里增加了一点安全性,因为您的特定算法不太可能在某处存在彩虹表。在两个用户拥有相同密码的情况下没有用,因为这些密码都会散列到同一个散列,因此攻击者会获得两个密码。这是每个用户的独特盐很重要的地方,因为这意味着攻击者需要为每个用户单独尝试每个密码,而不是每个密码只为所有用户尝试一次。

所以,你所做的并没有真正添加任何尚未做得更好的事情,而且最关键的还是缺乏独特的盐。