如何对 `string.Empty` 进行哈希处理?

4

由于某种原因,这对我来说没有意义。当字符串中没有字符可用于哈希时,空字符串如何被哈希?

我的问题看起来像这样:

System.Web.Helpers.Crypto.HashPassword(string.Empty);

这怎么可能实现?

通常情况下,哈希函数通过更新一些内部状态来处理数据。如果没有要处理的数据,则最终状态与初始状态相同。 - ntoskrnl
如果没有字符可以计数,如何计算string.empty.length? - Eric Lippert
在这种情况下,短字符串(包括空字符串)将简单地用0x00字节填充,直到其长度达到64个字节,然后进行哈希处理。 - CodesInChaos
1个回答

6

来自MSDN:

密码哈希是使用RFC 2898算法生成的,该算法使用128位盐、256位子密钥和1000次迭代。生成的哈希字节流的格式为{0x00,salt,subkey},在返回之前进行base-64编码。

首先,您需要了解RFC 2898的工作原理。简而言之,它将盐与传入的密码组合,对其进行多次哈希,并产生一个字节流,可以读取尽可能多的字节。

使用上述引用文档,我们可以看到它选择一个128位大的随机盐,在结尾处使用1000个哈希值,并从流中提取256位。

因为RFC 2898允许您从函数的输出中获取任意数量的字节,所以我们可以获取字符。它的输出不是固定的。如果我们两次调用 Crypto.HashPassword(string.Empty); ,我们也会得到不同的输出,因为每次调用该函数时都会选择一个新的随机盐。

还要注意,哈希函数仍然可以在空输入上定义。例如,您可以对零字节文件或零长度字符串进行哈希处理,它们应该给出相同的输出。 - tsechin
大多数哈希函数都是对数据块进行操作的,不完整的数据块通常会用一系列0字节值填充以达到下一个更大的块大小。然而,请查看您感兴趣的哈希函数的规范以获取确切的过程,上述内容只是一般的“大多数哈希函数所做的”指南。 - Scott Chamberlain

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接