哈希函数和保护密码


Hash Functions and Keeping Passwords Protected

我一直想知道不同形式的哈希等密码。是的,我知道腌制,可能会把它加到土豆泥里,但这是没有任何腌制的。我可能会使用动态腌制技术。

除此之外,我想知道做我下面展示的事情是否合乎逻辑?

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

回声输出如下:

1180170431

464e07fc9e46359fb480839150595c5

d27937f914ebe99ee315f04449678eccfb658191

$hash_crc32_md5 = $hash_md5 + $hash_crc32 + $hash_sha1 . $hash_md5 . $hash_crc32 . $hash_sha1;
<?php echo '<br /><br />' .$hash_crc32_md5; ?>

回声输出:

5820170431464e07afc9e46359fb480839150595c51180170431d27937f914ebe99ee315f04449678eccfb658191

那么,你认为这样散列密码会是一种过度杀戮吗?我应该坚持一种加盐的方式吗?我知道我不能第一个想到这样的事情,因为这似乎真的很明显。

同样,你认为用这种形式运行哈希冲突等会有多困难?

感谢您的回复!:)

是不是太夸张了?我不能对此发表评论。我声明,它可能比仅使用其中一种方法(根据信息论)安全性低。

原因是,通过提供多种哈希算法的结果,您实际上向潜在的黑客提供了更多信息。

这些哈希方法中使用的算法并没有什么秘密。哈希删除信息的原因是,虽然它是可逆的,但有大量可能的文本可以产生相同的哈希。

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

从MD5散列的角度考虑。也许有一万亿种不同的文本可以产生这种价值。这是一个非常大的搜索空间。

现在考虑一下SHAx散列。也可能有一万亿种不同的文本可以产生它。同样,这是一个巨大的搜索空间。

但是,如果这两个搜索空间的相交是四十二个不同的文本,那么很快就会破解。

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

哈希密码的意义在于,你仍然可以通过像第一次哈希一样对明文密码进行哈希,然后将其与存储的哈希进行比较,来验证密码,而无需将哈希值反转为明文形式。从这个意义上说,你所做的并不会影响这一目的。

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

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

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