【问题标题】:How to generate custom length hash key?如何生成自定义长度哈希键?
【发布时间】:2015-11-23 13:23:04
【问题描述】:

我正在尝试使用生成 64 长度字符串的 SHA-256 生成哈希密钥,但我需要大小为

【问题讨论】:

  • 你不能使用长度为 32 的子字符串吗?
  • SHA-256 产生 32 字节(256 位)的哈希值。我怀疑您不应该将哈希编码为十六进制。
  • @Shivam substring a hash key 这是创建冲突的好方法。
  • 更少的密钥空间 = 更多的冲突。假设接近完美的分布应该意味着一半的 sha256 与完整的 sha128(或 128 位的 MD5)发生冲突的频率完全相同(如果有的话)。显然,尝试将更多位塞入编码表示中比删除位更有意义,但子串并没有超出它们明显的作用。相关:stackoverflow.com/questions/18134627/…(sha1 十六进制编码子字符串)
  • @Averroes:是什么让您觉得 64 位散列函数的前 32 位比专门构建的 32 位散列函数差?

标签: java encryption cryptography sha


【解决方案1】:

如前所述,您掉落的每个钻头都会降低碰撞阻力。然而,散列被认为与随机无法区分。由于雪崩效应,输入的每一位都由散列中的每一位“表示”。因此,您确实可以简单地使用哈希输出的前 128 位/16 字节。那仍然会给您留下一些 64 位的抗碰撞性。或多或少的标准方法是采用 leftmost 个字节。

其他提示:

  • 要获得一些额外的安全性,请使用带有静态、随机生成的 128 位密钥的 HMAC 结果,而不是散列的输出;
  • 当然,如果您可以存储任何字符串而不仅仅是十六进制,您也可以将哈希编码为 base 64 并使用它。在这种情况下,您可以将 32 * 6 = 192 位放入该值中,这将导致比 SHA-1 哈希值更高的安全性(现在被认为是不安全的,请保持 SHA-2)。

【讨论】:

  • 我还建议将 SHA-256 或 SHA-512 编码为 6 位并截断以获得 192 位的抗碰撞性
  • 我想我在最后一句中明确推荐了 SHA-2,但我会尽量让这一点更明显。
猜你喜欢
  • 1970-01-01
  • 2015-03-30
  • 2012-06-13
  • 1970-01-01
  • 2014-02-24
  • 1970-01-01
  • 1970-01-01
  • 2012-03-07
相关资源
最近更新 更多