在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因此,字符串的第一部分(散列)将导致令牌的不可猜测性,而第二部分将保证其唯一性。
希望这个能帮到别人。
发布于 2014-04-17 18:51:00
我不认为你需要担心UUID的重叠。
从这些数据来看,每年被陨石击中的风险估计为170亿,38,这意味着概率约为0.00000000006 (6×10−11),相当于一年内产生数十亿UUID并有一个重复的几率。换句话说,在接下来的100年中,只有在每秒生成10亿UUID之后,创建一个副本的概率才会达到50%左右。或者,换句话说,如果地球上每个人都拥有6亿个UUID,那么一个复制的概率大约是50%。
复本
继续使用String::uuid()和rest easy :)
发布于 2013-07-27 15:03:18
UUID是唯一的
在cakphp中插入记录时,我需要创建真正唯一的令牌。
那就是什么UUID。它通常用于分布式系统,以防止冲突(多个源将数据插入数据源,可能是不同步的)。
UUID不是安全措施。
我需要它的独特和非常安全的同时
不确定哈希uuid应该以何种方式增强安全性--它不会。依赖默默无闻或多或少是肯定会失败的。
如果您需要的是某种形式的随机标记--使用散列函数(哈希uuid只是对一个随机种子进行散列),如果您需要保证-唯一标识符使用uuid。它们不是一回事,UUID是一种非常糟糕的机制,用来生成随机的、非连续的“不可猜测的”(或任何目的)字符串。
https://stackoverflow.com/questions/17899091
复制相似问题