1

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

除了所有这些,我想知道做我下面展示的事情是否合乎逻辑?

<?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; ?>

回声输出:

5820170431464e07afc9e46359fb480839150595c51180170431d27937f914ebe99ee315f04449678eccfb658191

那么你认为像这样散列密码会是一种过度杀戮吗?我应该只坚持一种加盐的散列形式吗?我知道我不能成为第一个想到这样的事情的人,因为它看起来真的很明显。

以及您认为使用这种形式遇到散列冲突等会有多困难?

感谢您的任何回复!:)

4

2 回答 2

4

是不是矫枉过正?我无法对此发表评论。我说明它可能不如仅使用其中一种方法安全(就信息论而言)。

原因是您实际上通过提供多个散列算法的结果向潜在黑客提供了更多信息。

这些散列方法中使用的算法一点也不神秘。散列消除了信息,因为虽然它是可逆的,但有大量可能的文本可以产生相同的散列。

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

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

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

但是,如果这两个搜索空间的交集是 42 种不同的文本,那么很快就可以破解。

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

于 2012-01-13T03:29:01.990 回答
1

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

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

另一个弱点是彩虹表,有人已经费力地创建了一个表,将所有可能的密码映射到它们的哈希值。您的技术在这里增加了一点安全性,因为您的特定算法不太可能在某处拥有现有的彩虹表。如果两个用户拥有相同的密码,这无济于事,因为它们都将散列到相同的散列,因此攻击者可以一举两得。这就是每个用户唯一的盐很重要的地方,因为这意味着攻击者需要单独为每个用户尝试每个密码,而不是每个密码只为所有用户尝试一次。

所以,你所做的并没有真正添加任何尚未做得更好的东西,最关键的是仍然缺乏独特的盐。

于 2012-01-13T03:34:10.663 回答