【问题标题】:How can `string.Empty` be hashed?`string.Empty` 如何被散列?
【发布时间】:2014-01-21 17:50:09
【问题描述】:

出于某种原因,这对我来说没有意义。当string 中没有要散列的chars 时,如何对空的string 进行散列?

我所说的应该是这样的:

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

这怎么可能?

【问题讨论】:

  • 一般来说,哈希函数通过更新一些内部状态来处理数据。如果没有数据需要处理,则最终状态与初始状态相同。
  • 如果没有字符可计算,如何计算string.empty.length?
  • 在这种情况下,短字符串(包括空字符串)将简单地用 0x00 字节填充,直到达到 64 字节长,然后进行散列处理。

标签: c# .net string hash cryptography


【解决方案1】:

来自the MSDN

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

首先你需要了解RFC 2898 works.简而言之,它将盐与传入的密码相结合,对其进行多次哈希处理,并生成一个字节流,您可以根据需要读取任意数量的字节。

使用上面引用的文档,我们看到它选择了一个 128 位大的随机盐,使用 1000 个哈希,最后从流中提取 256 位。

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

【讨论】:

  • 另请注意,哈希函数仍然在空输入上定义。例如,您可以散列一个零字节文件或零长度字符串,它们应该为您提供相同的输出。
  • 大多数散列函数对数据块进行操作,不完整的块通常会用一组 0 字节值填充以进入下一个更大的块大小。但是,请参阅您感兴趣的任何哈希规范以了解确切的过程,以上只是一般的“他们中的大多数人所做的”指南。
猜你喜欢
  • 1970-01-01
  • 2017-10-13
  • 2011-10-06
  • 2010-09-26
  • 1970-01-01
  • 2016-07-18
  • 2016-09-04
  • 2017-02-23
  • 1970-01-01
相关资源
最近更新 更多