关于安全性:PHP 7 OAuthProvider VS random_bytes令牌生成

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"


我会选择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核心函数也会比扩展受到更多的审查和更好的支持。