我尝试在 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
编码可能适合将其转换为完整的字符标记(不是为了安全性)。
我在这里询问这是否适合生成访问令牌,如果没有,是否有更好的方法来生成访问令牌?
答案 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
此代码在加密方面更加安全,但是,对于您正在做的事情,您应该没问题。
在外行人的术语中加密安全是随机的,很难重新创建或预测。