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

时间:2017-07-27 09:56:27

标签: php hash

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

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

1 个答案:

答案 0 :(得分:2)

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

假设你确实开发了一个“小”哈希,这将是你自己创造的东西,所以它本身就是不安全的,所以你会因为没有多少回报而遇到所有麻烦。

  • 为什么你需要哈希?
    • 您试图减轻哪些安全风险?
  • 您为什么不使用更安全的password_hash功能或类似功能?
  • Don't roll your own 即可。

你可以尝试截断你的MD5()哈希值,但实际上,它是一个32个字符的哈希值,你将其减少到5个,这意味着你有很大的碰撞机会,其中两个源值相同哈希值。这已经是md5的问题之一,那就是32个字符,只有5个,你试图通过用茶杯舀出来阻止沉没的远洋班轮。

代替救生艇。

您也可以设置一个随机字节生成器,例如OpenSSL_random _pseudo_bytesrandom_bytes,为您提供随机块,然后将它们与Associative database table相关联。

所以可能的解决方案:

$bytes = random_bytes(10);
var_dump(bin2hex($bytes));

他们的表:

 id  | their data
-----|-----  
 10  |  gedgfdgfdhfd 
 11  |  dgdgfdhfdhf  
 15  |  dfsgdfhdffdhf

你的桌子:

  id  | key | random_hash
 ----------------------------
   1  | 10  | 7bc4cb77c27d8b0a49eb
   2  | 15  | a49ebc89b757bc4ccb4e

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

使用5个字符的哈希值做的任何事情都不值得花时间编写代码( Source):

enter image description here

另请注意,此图片来自2010年,现在,计算机更快,更能破坏您的哈希值(Source)。

总体而言:不要这样做。