PHP:生成具有给定长度的字符串的哈希函数

Tim*_*row -1 php hash

我需要一个函数,它从具有固定长度(比如 5)的任意参数集(或序列化字符串)创建哈希,因为我需要这些哈希作为密钥长度有限的外部数据库中的密钥(因此 md5 将不行)。

有这样的功能吗?或者我应该使用 md5 然后子字符串吗?

Mar*_*tin 5

从安全性和实用性的角度来看,拥有一个小的固定长度的散列实际上毫无价值。假设您有一个长度为 512 字节(64 个字符)的数据块字符串,如何将其散列为唯一的 5 个字符(40 个字节)字符串?

假设您确实开发了一个“小”哈希,它将是您自己制作的东西,因此它本质上是不安全的,因此您将遇到所有这些麻烦而没有太多回报。

  • 为什么你需要一个哈希?
    • 您试图减轻什么安全风险?
  • 为什么不使用更安全的password_hash功能或类似功能?
  • 不要自己滚动

您可以尝试截断您的MD5()哈希值,但实际上,它是一个 32 个字符的哈希值,而您将其减少到 5 个,这意味着发生冲突的可能性很大,其中两个源值生成相同的哈希值。这已经是 md5 的问题之一,它有 32 个字符,有 5 个字符,你试图通过用茶杯救出来阻止正在下沉的远洋班轮。

而是操纵救生艇。

您不妨设置一个随机字节生成器,例如OpenSSL_random _pseudo_bytesrandom_bytes,为您提供随机块,然后将它们与关联数据库表相关联。

所以一个可能的解决方案:

$bytes = random_bytes(10);
var_dump(bin2hex($bytes));
Run Code Online (Sandbox Code Playgroud)

他们的表:

 id  | their data
-----|-----  
 10  |  gedgfdgfdhfd 
 11  |  dgdgfdhfdhf  
 15  |  dfsgdfhdffdhf
Run Code Online (Sandbox Code Playgroud)

你的桌子:

  id  | key | random_hash
 ----------------------------
   1  | 10  | 7bc4cb77c27d8b0a49eb
   2  | 15  | a49ebc89b757bc4ccb4e
Run Code Online (Sandbox Code Playgroud)

因此用户知道random_hash并且您可以将其等同于您需要的外部表中的行的 id。这需要一些设置工作,我对您的情况做了很多假设,但这是一个可能的解决方案。


你对 5 个字符的哈希值所做的任何事情都不值得你花时间编写代码( 源代码):

在此处输入图片说明

另请注意,此图形来自 2010 年,因此现在,计算机速度更快,破解哈希的能力也更强(来源)。


总而言之:不要这样做。