在CakePHP中插入记录时,我需要创建真正唯一的令牌。这个表可以包含数百万行,所以我不能仅仅基于一些随机生成的字符串。我也不想使用microtime(),因为可以同时提交两个记录的可能性很小。当然,最好的解决方案是使用String::uuid(),但是来自cakephp文档。
uuid方法用于根据RFC 4122生成唯一标识符。uuid是一个128位字符串,格式为485fc381-e790-47a3-9794-1337c0a8fe68。
因此,据我所知,它不使用蛋糕的安全盐为其一代。因此,我决定通过安全组件的散列函数(或Auth密码函数)对其进行散列,因为我需要它是唯一的,同时非常非常安全。但后来我发现了这个问题,说这不是个好主意,而是针对php和md5。为什么MD5'ing一个UUID不是一个好主意?
而且,我还认为由安全组件进行散列的字符串很难猜测--因为,例如,String::uuid() in 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确实是唯一的,但是从上面的例子来看,有些记录有一些相似之处。但是,散列的结果并非如此。
谢谢!!
发布于 2013-09-17 07:42:41
我想出了以下解决方案
由于连接当前时间(以微秒为单位)和随机字符串的哈希(散列)而使用字符串
$timeStr = str_replace("0.", "", microtime());
$timeStr = str_replace(" ", "", $timeStr);
echo Security::hash('random string').'_'.$timeStr;
// 5ffd3b852ccdd448809abb172e19bbb9c01a43a4_796473001379403705因此,字符串的第一部分(散列)将导致令牌的不可猜测性,而第二部分将保证其唯一性。
希望这个能帮到别人。
https://stackoverflow.com/questions/17899091
复制相似问题