为了生成32个字符的令牌来访问我们的API,我们目前使用:
$token = md5(uniqid(mt_rand(), true));我读到过这种方法不是加密安全的,因为它是基于系统时钟的,而openssl_random_pseudo_bytes将是一个更好的解决方案,因为它将更难预测。
如果是这样的话,等价的代码会是什么样子呢?
我假设是这样的,但我不知道这是不是对的。
$token = md5(openssl_random_pseudo_bytes(32));还有,我应该传递给函数的长度是多少?
发布于 2013-09-19 16:57:41
以下是正确的解决方案:
$token = bin2hex(openssl_random_pseudo_bytes(16));
# or in php7
$token = bin2hex(random_bytes(16));发布于 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处找到它)
<?php
require_once('path/to/cryptolib.php');
$token = IcyApril\CryptoLib::randomString(16);
?>在https://cryptolib.ju.je/上可以找到完整的CryptoLib文档。它涵盖了许多其他随机方法,级联加密和散列生成和验证;但如果您需要它,它就在那里。
发布于 2013-09-17 12:56:52
如果你有一个加密安全的随机数生成器,你不需要散列它的输出。事实上,您并不想这样做。只需使用
$token = openssl_random_pseudo_bytes($BYTES,true)其中$BYTES是您想要的多少字节的数据。MD5有一个128位的哈希,所以16个字节就可以了。
作为附注,您在原始代码中调用的函数都不是加密安全的,大多数都是足够有害的,即使与安全的其他函数结合使用,只使用一个函数也是不安全的。MD5存在安全问题(尽管对于此应用程序,这些问题可能并不重要)。Uniqid不仅在默认情况下不会生成加密随机字节(因为它使用系统时钟),而且您传入的附加熵是使用线性同余生成器组合的,这在密码上是不安全的。事实上,这可能意味着一个人可以猜测出你所有的API密钥,即使他们不知道你的服务器时钟的值,也可以访问其中的一些。最后,用作额外熵的mt_rand()也不是一个安全的随机数生成器。
https://stackoverflow.com/questions/18830839
复制相似问题