安全地生成随机值

3.4 版本
维护中的版本

陪伴着Symfony安全组件的是一些很好用的“与安全相关”的方法。这些方法被Symfony自己用到,如果你希望解决一些它们能够对付的问题,也可以使用它们。

Note

文中方法仅在PHP5.6和PHP7.0中能够使用。如果是老版本的PHP,Symfony Polyfill Component提供了一个polyfill。(译注:polyfill是指对“老旧版本浏览器”等环境提供兼容代码以便实现同样功能)。

字符串比较 

比较两个字符串时,所耗费的时间取决于它们之间的差异。比如,当这两个字符串用作“密码比对”时,攻击者可以利用这点。这被称为Timeing attack时序攻击。

比较两个密码时,你应该使用hash_equals函数:

1
2
3
if (hash_equals($knownString, $userInput)) {
    // ...
}

生成一个安全的随机字符串 

当你需要生成一个安全的随机串时,强列推荐使用random_bytes

1
$random = random_bytes(10);

这个函数返回一个随机字符串,可用于加密,其位数就是传入的参数数字(上例中是10)。

Tip

random_byte()函数返回一个二进制字符串,可能包含\0字符。在一些常见场合,这可能引起麻烦,比如把这个值存到数据库中,或者作为URL的一部分。解决办法是,把random_byte()返回的值加密或hash(你可以用base64_encode()这个简单的PHP函数)。

生成一个安全的随机值 

如果你希望生成用加密用的安全随机整数,你应该使用random_int()函数:

1
$random = random_int(1, 10);

本文,包括例程代码在内,采用的是 Creative Commons BY-SA 3.0 创作共用授权。

登录symfonychina 发表评论或留下问题(我们会尽量回复)