首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >CakePHP中的唯一令牌

CakePHP中的唯一令牌
EN

Stack Overflow用户
提问于 2013-07-27 14:52:52
回答 4查看 6.2K关注 0票数 2

在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循环中有这样一个输出

代码语言:javascript
运行
复制
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

所以,毕竟字符串的某些部分是相似的,但是在使用散列函数时,结果是非常不同的。

代码语言:javascript
运行
复制
echo Security::hash('stackoverflow1');
echo "<br>";
echo Security::hash('stackoverflow2');

die;
// outputs
e9a3fcb74b9a03c7a7ab8731053ab9fe5d2fe6bd
b1f95bdbef28db16f8d4f912391c22310ba3c2c2

因此,问题是,我是否可以在Cake中散列uuid()?或者什么是获得真正独特和散列(根据我的安全盐)安全令牌的最佳安全方式。

更新

说到安全令牌,我的意思是猜测是多么困难。UUID确实是唯一的,但是从上面的例子来看,有些记录有一些相似之处。但是,散列的结果并非如此。

谢谢!!

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2013-09-17 07:42:41

我想出了以下解决方案

由于连接当前时间(以微秒为单位)和随机字符串的哈希(散列)而使用字符串

代码语言:javascript
运行
复制
$timeStr = str_replace("0.", "", microtime());
$timeStr = str_replace(" ", "", $timeStr);
echo Security::hash('random string').'_'.$timeStr;

// 5ffd3b852ccdd448809abb172e19bbb9c01a43a4_796473001379403705

因此,字符串的第一部分(散列)将导致令牌的不可猜测性,而第二部分将保证其唯一性。

希望这个能帮到别人。

票数 1
EN

Stack Overflow用户

发布于 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 :)

票数 3
EN

Stack Overflow用户

发布于 2013-07-27 15:03:18

UUID是唯一的

在cakphp中插入记录时,我需要创建真正唯一的令牌。

那就是什么UUID。它通常用于分布式系统,以防止冲突(多个源将数据插入数据源,可能是不同步的)。

UUID不是安全措施。

我需要它的独特和非常安全的同时

不确定哈希uuid应该以何种方式增强安全性--它不会。依赖默默无闻或多或少是肯定会失败的。

如果您需要的是某种形式的随机标记--使用散列函数(哈希uuid只是对一个随机种子进行散列),如果您需要保证-唯一标识符使用uuid。它们不是一回事,UUID是一种非常糟糕的机制,用来生成随机的、非连续的“不可猜测的”(或任何目的)字符串。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17899091

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档