生成php访问令牌

时间:2017-02-04 22:31:47

标签: php authorization access-token

我尝试在 php 中为用户授权生成访问令牌

我使用了以下内容:

base64_encode(com_create_guid());

在这种情况下是否正确使用?什么是"加密安全"

修改

首先,我将使用像this

这样的函数生成随机字符串
function generateRandomString($length = 10) {
    $characters = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';
    $charactersLength = strlen($characters);
    $randomString = '';
    for ($i = 0; $i < $length; $i++) {
        $randomString .= $characters[rand(0, $charactersLength - 1)];
    }
    return $randomString;
}

但后来我读到这个令牌必须是加密安全的,而且我无法真正得到这个确切或准确的内容。

然后我去了com_create_guid(),但我注意到com_create_guid()生成了UUID,它不包含所有字符(只是数字+十六进制的a-f)。所以我认为base64编码可能适合将其转换为完整的字符标记(不是为了安全性)。

我在这里询问这是否适合生成访问令牌,如果没有,是否有更好的方法来生成访问令牌?

2 个答案:

答案 0 :(得分:1)

返回$ len中给出的加密强度的随机字符串。字符串总是比$ len长3-4个扩展(也就是说,编码3个长度需要4个字符)。通过$ len至少16来获得良好的力量。

https://stackoverflow.com/a/8429944/14768被盗并编辑为使用/dev/random代替/dev/urandom

function generateRandomString($len)
{
    $fp = @fopen('/dev/random','rb');
    $result = '';
    if ($fp !== FALSE) {
        $result .= @fread($fp, $len);
        @fclose($fp);
    }
    else
    {
        trigger_error('Can not open /dev/urandom.');
    }
    // convert from binary to string
    $result = base64_encode($result);
    // remove none url chars
    $result = strtr($result, '+/', '-_');
    // Remove = from the end
    $result = str_replace('=', ' ', $result);
    return $result;
}

当想要加密强度的东西时,使用加密强度的东西。 guidv4不保证是加密强度。

答案 1 :(得分:0)

您可能想要使用它:

function guidv4()
{
    if (function_exists('com_create_guid') === true)
        return trim(com_create_guid(), '{}');

    $data = openssl_random_pseudo_bytes(16);
    $data[6] = chr(ord($data[6]) & 0x0f | 0x40); // set version to 0100
    $data[8] = chr(ord($data[8]) & 0x3f | 0x80); // set bits 6-7 to 10
    return vsprintf('%s%s-%s-%s-%s-%s%s%s', str_split(bin2hex($data), 4));
}

来源:http://php.net/manual/en/function.com-create-guid.php#117893

此代码在加密方面更加安全,但是,对于您正在做的事情,您应该没问题。

在外行人的术语中加密安全是随机的,很难重新创建或预测。