【问题标题】:php 32 byte length secure hashphp 32 字节长度的安全哈希
【发布时间】:2014-07-17 10:01:47
【问题描述】:

我需要一个产生 32 字节长度散列的散列函数。 我不能使用 MD5,因为它不安全。
所以我检查了hash_algos()函数提供的php算法。 感谢this 的帖子,我发现只有三种算法可以产生 32 字节长度的哈希:

  • 哈弗128,5
  • 虎 128,3
  • 成熟 128

但我发现它们并不安全。

对于哈弗128已经发现了一些碰撞。确实我发现了:

攻击打破了完整的HAVAL-128
来源:http://www.securiteam.com/securityreviews/6N00C0KC0Q.html

对于我在wikipedia 上发现的 Tiger 算法,该算法的 24 轮版本没有发现任何冲突。但是算法的 24 轮版本是tiger192,4,它给出了 48 长度的哈希。

最后,对于ripemd 128,总是在wikipedia,我找到了

2004 年 8 月,据报道原始 RIPEMD 发生了冲突。这不适用于 RIPEMD-160。

那么你知道是否有一个有效的安全替代 md5 散列产生相同长度的散列?

【问题讨论】:

  • “安全”本身并没有多大意义。要问的问题是,安全防范什么?你将如何使用这个散列函数?为什么限制为 32 个字符?为什么你甚至谈论“字符”而不是字节?
  • 你到底需要这个做什么?碰撞风险可能不像您想象的那么严重,具体取决于您的目的。如果它是用于文件哈希来识别更改,那么它可能就足够了;如果是用于密码,那么您不应该依赖任何类型的简单无盐哈希
  • 我不知道有任何可能实现这一目标。为什么它的长度必须是 32?
  • 如果安全是一个问题,在计算哈希时使用盐(无论它可能是什么)总是可取的。
  • 只需使用允许您控制生成大小的哈希:crypt 允许您指定给定大小的哈希。只需确保分隔符计数 + 分隔符长度 + 哈希长度 === 32

标签: php hash md5


【解决方案1】:

但算法的 24 轮版本是tiger192,4,它给出了 48 长度的哈希。

tiger192,4 版本实际上是 32 轮而不是 24 轮(即 tiger192,3iirc);那么为什么不直接使用它,而是使用 base-64 对结果进行编码呢?

$data = 'hello';
echo base64_encode(hash('tiger192,4', $data, true));
// 6OUOI5+TKhw1cZTl6tD1KNwq6/6u0Bx0

要求hash() 函数返回原始结果,然后将其传递给base64_encode();它正好适合 32 个字节。当您使用 hash_hmac() 时,同样适用。

这假设您没有将其用于密码哈希,因为您应该为该 imo 使用 password api

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-09-22
    • 2018-04-09
    • 2010-09-28
    相关资源
    最近更新 更多