我需要一个函数,它从具有固定长度(比如 5)的任意参数集(或序列化字符串)创建哈希,因为我需要这些哈希作为密钥长度有限的外部数据库中的密钥(因此 md5 将不行)。
有这样的功能吗?或者我应该使用 md5 然后子字符串吗?
从安全性和实用性的角度来看,拥有一个小的固定长度的散列实际上毫无价值。假设您有一个长度为 512 字节(64 个字符)的数据块字符串,如何将其散列为唯一的 5 个字符(40 个字节)字符串?
假设您确实开发了一个“小”哈希,它将是您自己制作的东西,因此它本质上是不安全的,因此您将遇到所有这些麻烦而没有太多回报。
password_hash功能或类似功能?您可以尝试截断您的MD5()哈希值,但实际上,它是一个 32 个字符的哈希值,而您将其减少到 5 个,这意味着发生冲突的可能性很大,其中两个源值生成相同的哈希值。这已经是 md5 的问题之一,它有 32 个字符,有 5 个字符,你试图通过用茶杯救出来阻止正在下沉的远洋班轮。
而是操纵救生艇。
您不妨设置一个随机字节生成器,例如OpenSSL_random _pseudo_bytes或random_bytes,为您提供随机块,然后将它们与关联数据库表相关联。
$bytes = random_bytes(10);
var_dump(bin2hex($bytes));
Run Code Online (Sandbox Code Playgroud)
他们的表:
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
因此用户知道random_hash并且您可以将其等同于您需要的外部表中的行的 id。这需要一些设置工作,我对您的情况做了很多假设,但这是一个可能的解决方案。
你对 5 个字符的哈希值所做的任何事情都不值得你花时间编写代码( 源代码):
另请注意,此图形来自 2010 年,因此现在,计算机速度更快,破解哈希的能力也更强(来源)。