PHP 7 OAuthProvider VS random_bytes token generation
我的目标只是生成一个临时令牌,用于URL中的用户标识,我应该使用OAuthProvider::generateToken还是random_bytes?
从这些答案中:
在php中生成一次性令牌:随机字节还是openssl 随机伪字节?
和
为忘记密码生成随机令牌的最佳实践
与openssl_random_pseudo_bytes相比,random_bytes似乎是php 7最近更新的选项。与OAuthProvider::generateToken相比是否相同?
示例:
1 2 3
| $rb_token = bin2hex(random_bytes ($length));
$oa_token = bin2hex((new OAuthProvider ())->generateToken($length, TRUE));
// TRUE = strong"/dev/random will be used for entropy" |
- 取决于可移植性,got to install oauthprovider,random_bytes如果您得到php7和openssl,通常在大多数部署中都可用,那么都会创建随机字节。你在问哪个更随意?什么是随机的?
- 另外,忘记密码令牌不需要是密码随机的。
- @你是说可以猜到密码重置令牌吗?
- 猜测一个正常长度的nonce令牌,然后正确输入该令牌的电子邮件地址的几率。仅仅是黑客的电子邮件或是暴力破解账号要容易得多。另外,我没有说猜测,我说不需要加密安全。定时攻击和侧通道攻击不是上述任何功能的问题。
- @lawrencehrone要"破解"一个简单的prng,唯一需要猜测的是seed,例如在c random()中,seed是32位,在php中是31位(php只使用signed)。如果你可以尝试每秒1000次,你肯定会在49天内得到正确的答案,而且你有一个合理的机会更早得到它。我觉得这还不够好。对于任何一个合适的Web应用程序来说,1000/s都是一个保守的猜测。
- @正如加博所指出的,从我提出的两种可能性来看,我想知道哪种方法比其他人"猜测"令牌的概率低,以及为什么。
我会选择random_bytes(如果使用php<7,则存在信誉良好的polyfill,random-compat)。对于您的情况,/dev/urandom和/dev/random之间的差异可以忽略不计(可以在这里找到更详细的解释)。
random_bytes使用getrandomsyscall或/dev/urandom(源代码),而没有强模式的OAuthProvider::generateToken()如果生成的字符串太短(源代码和php_mt_rand的源代码),则似乎会退回到一些不安全的实现。因此,random_bytes比可用性(没有不安全的模式)更具优势,而且在使用getrandom系统调用的系统上,它应该是首选方法(此处详细解释)。
得出结论的另一种方法是查看一些广泛使用的库:对于symfony应用程序,fosoauthserver包也使用random_bytes。最后但同样重要的是,我相信一些PHP核心函数也会比扩展受到更多的审查和更好的支持。
- 谢谢您。只需快速查看OAuthProvider::generateToken()源,它似乎也使用/dev/urandom和/dev/random,当使用强时。(934号线fd = open(strong?"/dev/random":"/dev/urandom", O_RDONLY);号线)。
- 没错,强模式的OAuthProvider::generateToken()和random_bytes几乎是一样的。因此,我的结论过于简单易用,但也许我应该编辑我的信息使其更清晰?