首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >生成密码安全令牌

生成密码安全令牌
EN

Stack Overflow用户
提问于 2013-09-16 22:43:56
回答 4查看 80.3K关注 0票数 87

为了生成32个字符的令牌来访问我们的API,我们目前使用:

代码语言:javascript
复制
$token = md5(uniqid(mt_rand(), true));

我读到过这种方法不是加密安全的,因为它是基于系统时钟的,而openssl_random_pseudo_bytes将是一个更好的解决方案,因为它将更难预测。

如果是这样的话,等价的代码会是什么样子呢?

我假设是这样的,但我不知道这是不是对的。

代码语言:javascript
复制
$token = md5(openssl_random_pseudo_bytes(32));

还有,我应该传递给函数的长度是多少?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2013-09-19 16:57:41

以下是正确的解决方案:

代码语言:javascript
复制
$token = bin2hex(openssl_random_pseudo_bytes(16));

# or in php7
$token = bin2hex(random_bytes(16));
票数 196
EN

Stack Overflow用户

发布于 2014-12-29 08:45:08

如果你想使用openssl_random_pseudo_bytes,最好使用CrytoLib的实现,这将允许你生成所有的字母数字字符,在openssl_random_pseudo_bytes周围粘贴bin2hex只会导致你得到A-F (大写)和数字。

将路径/to/替换为您放置cryptolib.php文件的位置(您可以在GitHub上的https://github.com/IcyApril/CryptoLib处找到它)

代码语言:javascript
复制
<?php
  require_once('path/to/cryptolib.php');
  $token = IcyApril\CryptoLib::randomString(16);
?>

https://cryptolib.ju.je/上可以找到完整的CryptoLib文档。它涵盖了许多其他随机方法,级联加密和散列生成和验证;但如果您需要它,它就在那里。

票数 10
EN

Stack Overflow用户

发布于 2013-09-17 12:56:52

如果你有一个加密安全的随机数生成器,你不需要散列它的输出。事实上,您并不想这样做。只需使用

代码语言:javascript
复制
$token  = openssl_random_pseudo_bytes($BYTES,true)

其中$BYTES是您想要的多少字节的数据。MD5有一个128位的哈希,所以16个字节就可以了。

作为附注,您在原始代码中调用的函数都不是加密安全的,大多数都是足够有害的,即使与安全的其他函数结合使用,只使用一个函数也是不安全的。MD5存在安全问题(尽管对于此应用程序,这些问题可能并不重要)。Uniqid不仅在默认情况下不会生成加密随机字节(因为它使用系统时钟),而且您传入的附加熵是使用线性同余生成器组合的,这在密码上是不安全的。事实上,这可能意味着一个人可以猜测出你所有的API密钥,即使他们不知道你的服务器时钟的值,也可以访问其中的一些。最后,用作额外熵的mt_rand()也不是一个安全的随机数生成器。

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

https://stackoverflow.com/questions/18830839

复制
相关文章

相似问题

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