str_random() 函数是否像 uniqid() 函数一样使用任何时间戳?
Does the str_random() function use any time stamp like uniqid() function?
我正在为移动应用程序开发 API,我想创建一个唯一的令牌用于用户验证。目前我正在为此使用 str_random(30) 函数。
基本上我想知道 str_random() 函数是如何工作的。
它使用任何时间戳吗?
public function generateToken($user_id)
{
$randToken = str_random(30);
if (Token::updateOrCreate([
'user_id' => $user_id,
], [
'user_id' => $user_id,
"token" => $randToken
])
) {
return $randToken;
}
return "";
}
我在 laravel api 中搜索了 Str::random()
方法:https://laravel.com/api/5.8/Illuminate/Support/Str.html#method_random
这是 github 上用于生成随机字符串的确切代码:
https://github.com/laravel/framework/blob/5.8/src/Illuminate/Support/Str.php#L323
/**
* Generate a more truly "random" alpha-numeric string.
*
* @param int $length
* @return string
*/
public static function random($length = 16)
{
$string = '';
while (($len = strlen($string)) < $length) {
$size = $length - $len;
$bytes = random_bytes($size);
$string .= substr(str_replace(['/', '+', '='], '', base64_encode($bytes)), 0, $size);
}
return $string;
}
正如我所见,它不使用任何时间戳来生成随机字符串
str_random()
或 \Str::random()
使用 random_byte()
通过使用 OS 特定随机生成器生成加密安全伪随机字节。
CryptGenRandom
on windows (CNG-API
在 PHP >=7.2)
getrandom(2)
在 linux
- ...
所以它甚至比使用时间戳随机性更好,但不保证uniqid
的唯一性。
你可以为你的唯一令牌做的是使用 JWT (Json Web Token) 格式。每个令牌都是唯一的,因为在某些时候它使用实体的 ID,它有到期时间,这使得它在泄漏的情况下更安全,还有更多好处....
我正在为移动应用程序开发 API,我想创建一个唯一的令牌用于用户验证。目前我正在为此使用 str_random(30) 函数。
基本上我想知道 str_random() 函数是如何工作的。 它使用任何时间戳吗?
public function generateToken($user_id)
{
$randToken = str_random(30);
if (Token::updateOrCreate([
'user_id' => $user_id,
], [
'user_id' => $user_id,
"token" => $randToken
])
) {
return $randToken;
}
return "";
}
我在 laravel api 中搜索了 Str::random()
方法:https://laravel.com/api/5.8/Illuminate/Support/Str.html#method_random
这是 github 上用于生成随机字符串的确切代码: https://github.com/laravel/framework/blob/5.8/src/Illuminate/Support/Str.php#L323
/**
* Generate a more truly "random" alpha-numeric string.
*
* @param int $length
* @return string
*/
public static function random($length = 16)
{
$string = '';
while (($len = strlen($string)) < $length) {
$size = $length - $len;
$bytes = random_bytes($size);
$string .= substr(str_replace(['/', '+', '='], '', base64_encode($bytes)), 0, $size);
}
return $string;
}
正如我所见,它不使用任何时间戳来生成随机字符串
str_random()
或 \Str::random()
使用 random_byte()
通过使用 OS 特定随机生成器生成加密安全伪随机字节。
CryptGenRandom
on windows (CNG-API
在 PHP >=7.2)getrandom(2)
在 linux- ...
所以它甚至比使用时间戳随机性更好,但不保证uniqid
的唯一性。
你可以为你的唯一令牌做的是使用 JWT (Json Web Token) 格式。每个令牌都是唯一的,因为在某些时候它使用实体的 ID,它有到期时间,这使得它在泄漏的情况下更安全,还有更多好处....