密码可以与其哈希值相同吗?

信息安全 密码
2021-09-04 19:24:36

所以我和我的朋友在思考为什么密码有最大长度(并在这里找到了答案),我有一个奇怪的想法..密码可以和它的哈希值一样吗?
我意识到加盐哈希是基于 RNG 的,但有可能吗?如果是这样,机会有多大?

3个回答

理论上,是的。为了证明这一点,您需要做的就是对每个可能的输出哈希进行哈希处理,并查看它们中的任何一个是否产生与输入相同的值。

这可能需要一段时间。

在实践中,很少有人使用本身就是哈希函数的有效输出的密码,因为这将重写记住由数字和字母 A 到 F 组成的 30 多个字符串(假设是十六进制表示)。此外,在现代散列算法中使用盐会进一步混淆这个问题——密码必须是它自己的散列的一部分,而盐是剩下的部分。

在不使用盐的情况下散列密码的情况下,很可能但远不能确定存在一个将散列到自身的密码。正式证明它是否存在是不可行的,但是可以假设随机预言而不是散列函数来进行计算。在这种情况下,可以计算出此类密码存在的概率,结果约为 63%。完整的计算可以在关于加密 SE的答案中看到

然而,最佳实践是在散列密码时使用盐。这改变了计算,但也使问题变得有点模棱两可。至少有两种解释问题的方法,每种方法都可以单独回答。

是否存在一个密码,无论选择哪种盐,都将始终对其自身进行哈希处理?

不。

原因是盐包含在密码哈希中。当我们要求密码和密码哈希相同时,这意味着密码本身必须包含盐。并且对于任何其他盐的选择,密码都不会自行散列。

是否存在一个密码,对于至少一种盐的选择,它会自行散列?

很可能是的。分析类似于未加盐密码的情况。但是由于输入比输出具有更多的熵,因此得出的数字会非常不同。

让我们看看使用一些广泛使用的具体数字的计算。盐:48 位,哈希输出:512 位。

这意味着有 2⁵⁶⁰ 可能的输入,每个输入都有 1/2⁵¹² 的匹配概率。因此,它们都不匹配的概率将仅为 (1 - 1/2⁵¹²)^(2⁵⁶⁰) 使用之前的近似值,即 (1 - 1/2⁵¹²)^(2⁵¹²) ≃ 27% 的概率它们都不匹配因此得出 27%^(2⁴⁸) ≃ 0。

有时它会出现,如果散列或加盐散列的输出与输入相同,那该有多有趣。

作为设计标准的一部分,散列算法通常不会对此提供任何保护。事实上,很容易再添加一个步骤,说明如果输出匹配(部分)输入,则切换匹配部分的第一位,从而防止任何此类查找。

找到一个匹配的输入/输出肯定会让我着迷,然而,是什么让它不那么有趣,当你考虑时,哈希的哪个表示应该匹配输入?

输入通常是一系列 8 位字节,可以是各种编码的文本,也可以是原始二进制文件。

输出是固定数量的原始 8 位字节,通常表示为 n*8 位值的大端十六进制表示形式。

如果字符串格式的十进制(或二进制)数字(即“12345 ....”)的MD5输出是与完全相同的数字匹配的十六进制数字,那肯定会令人好奇,对吧?

但是,如果以二进制格式解释为大数的输出将是完全相同的数字(当以十进制格式打印时),我们大多数人甚至不会意识到等价性。但这在理论上同样有趣。

另一个例子,它可能非常可疑,但你会注意到这个(假)MD5 输出实际上是 ASCII 文本吗?

48454c5021496d207472617070656421

如果它以 Base64 编码的形式输出,我们大多数人都很难看到这一事实。