在 CakePHP 中插入记录时,我需要创建真正唯一的令牌。该表可以包含数百万行,所以我不能只基于一些随机生成的字符串。我也不想使用 a microtime()
,因为有可能同时提交两条记录的可能性很小。当然最好的解决方案是使用String::uuid()
,但是来自 cakephp 文档
uuid 方法用于根据RFC 4122生成唯一标识符。uuid 是一个 128 位的字符串,格式为 485fc381-e790-47a3-9794-1337c0a8fe68。
因此,据我了解,它的一代并不使用蛋糕的安全盐。因此,我决定通过安全组件的哈希函数(或 Auth Password 函数)对其进行哈希处理,因为我需要它是唯一的并且同时非常非常安全。但是后来我发现了问题,说这不是一个好主意,而是针对php uniqid和md5。 为什么 MD5'ing UUID 不是一个好主意?
而且,我还认为安全组件散列的字符串更难猜测 - 因为,例如String::uuid()
在 for 循环中有这样的输出
for ($i = 0; $i < 30; $i++) {
echo String::uuid()."<br>";
}
die;
// outputs
51f3dcda-c4fc-4141-aaaf-1378654d2d93
51f3dcda-d9b0-4c20-8d03-1378654d2d93
51f3dcda-e7c0-4ddf-b808-1378654d2d93
51f3dcda-f508-4482-852d-1378654d2d93
51f3dcda-01ec-4f24-83b1-1378654d2d93
51f3dcda-1060-49d2-adc0-1378654d2d93
51f3dcda-1da8-4cfe-abe4-1378654d2d93
51f3dcda-2af0-42f7-81a0-1378654d2d93
51f3dcda-3838-4879-b2c9-1378654d2d93
51f3dcda-451c-465a-a644-1378654d2d93
51f3dcda-5264-44b0-a883-1378654d2d93
所以,毕竟字符串的某些部分是相似的,但是在使用哈希函数的情况下,结果是完全不同的
echo Security::hash('stackoverflow1');
echo "<br>";
echo Security::hash('stackoverflow2');
die;
// outputs
e9a3fcb74b9a03c7a7ab8731053ab9fe5d2fe6bd
b1f95bdbef28db16f8d4f912391c22310ba3c2c2
所以,问题是,我可以在 Cake 中对 uuid() 进行哈希处理吗?或者什么是获得真正唯一和散列(根据我的安全盐更好)安全令牌的最佳安全方式。
更新
说安全令牌,我的意思是猜测有多么困难。UUID 确实是唯一的,但是从上面的例子来看,有些记录有一些相似之处。但散列结果没有。
谢谢 !!