php 32字节长度安全哈希

php 32字节长度安全哈希,php,hash,md5,Php,Hash,Md5,我需要一个生成32字节长度哈希的哈希函数。 我不能使用MD5,因为它不安全。 因此,我检查了hash\u algos()函数提供的php算法。 多亏了post,我发现只有三种算法可以生成32字节长度的哈希: 哈弗128,5 老虎128,3 Ripemd 128 但我发现它们都不安全 因为哈弗128号发现了一些碰撞。事实上,我发现: 这次袭击打破了哈弗-128的完整记录 资料来源: 对于Tiger算法,我发现在24轮版本的算法中没有发现碰撞。但该算法的24轮版本是tiger192,4,它给出了

我需要一个生成32字节长度哈希的哈希函数。 我不能使用MD5,因为它不安全。
因此,我检查了
hash\u algos()
函数提供的php算法。 多亏了post,我发现只有三种算法可以生成32字节长度的哈希:

  • 哈弗128,5
  • 老虎128,3
  • Ripemd 128
但我发现它们都不安全

因为哈弗128号发现了一些碰撞。事实上,我发现:

这次袭击打破了哈弗-128的完整记录
资料来源:

对于Tiger算法,我发现在24轮版本的算法中没有发现碰撞。但该算法的24轮版本是tiger192,4,它给出了48长度的散列

最后,对于ripemd 128,始终打开,我发现

2004年8月,据报道,原RIPEMD发生碰撞。这不适用于RIPEMD-160

那么,您知道在for md5哈希中是否有一个有效的安全替换,它生成相同长度的哈希

但该算法的24轮版本是tiger192,4,它给出了48长度的散列

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

$data = 'hello';
echo base64_encode(hash('tiger192,4', $data, true));
// 6OUOI5+TKhw1cZTl6tD1KNwq6/6u0Bx0
要求
hash()
函数返回原始结果,然后将原始结果传递给
base64_encode()
;它正好可以容纳32个字节。使用
hash\u hmac()
时,同样适用


这假设您没有将其用于密码散列,因为您应该将其用于该imo。

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