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 特定随机生成器生成加密安全伪随机字节。

所以它甚至比使用时间戳随机性更好,但不保证uniqid的唯一性。

你可以为你的唯一令牌做的是使用 JWT (Json Web Token) 格式。每个令牌都是唯一的,因为在某些时候它使用实体的 ID,它有到期时间,这使得它在泄漏的情况下更安全,还有更多好处....