Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/243.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在PHP中生成唯一的安全随机字符串?_Php_Unique Key - Fatal编程技术网

如何在PHP中生成唯一的安全随机字符串?

如何在PHP中生成唯一的安全随机字符串?,php,unique-key,Php,Unique Key,我想添加随机字符串作为表单提交的令牌,它生成的表单永远是唯一的。我花了很多时间在谷歌上,但我不知道该用哪种组合 当我在谷歌上搜索时,我发现了很多方法: 1) Combination of character and number. 2) Combination of character, number and special character. 3) Combination of character, number, special character and date time. 我可

我想添加随机字符串作为表单提交的令牌,它生成的表单永远是唯一的。我花了很多时间在谷歌上,但我不知道该用哪种组合

当我在谷歌上搜索时,我发现了很多方法:

1) Combination of character and number.

2) Combination of character, number and special character.

3) Combination of character, number, special character and date time.
我可以用哪种组合

我可以生成多少个随机字符串


任何其他安全的方法请告诉我。?

您应该选择3个选项。因为它有日期和时间,所以每次都是独一无二的。 你试过什么方法吗

str_shuffle($string)

每次它都从$string生成随机字符串。 结束然后使用substr

($string,开始,结束)

把它砍下来。
如果需要日期和时间,请结束,然后将结果字符串与之连接。

根据您的需要,您肯定可以获得更多的花式效果,但我将把它抛在一边,因为我经常使用它来描述您所描述的内容:

md5(rand());

它快速、简单、易于记忆。因为它是十六进制的,所以可以很好地与其他字符串配合使用。

请尝试以下代码,对于函数
getUniqueToken()
,它将返回长度为10(默认值)的唯一字符串

/*
此函数将返回唯一的令牌字符串。。。
*/
函数getUniqueToken($tokenLength=10){
$token=“”;
//字符、数字和特殊字符的组合。。。
$combinationString=“abcdefghijklmnopqrstuvxyzabcdefghijklmnopqrstuvxyz012456789*#和$^”;
对于($i=0;$i请参考此。这可能就是您正在寻找的


我认为最好将您的注意力转移到之前提出的问题上,该问题有更实质性的答案。您会发现很多选择。

以下是一些注意事项:

字母表

字符数可以被视为编码的
字母表
。它本身并不影响字符串强度,但较大的字母表(数字、非字母数字字符等)允许具有类似强度的较短字符串(也称为
键空间
),因此,如果您正在寻找较短的字符串,它非常有用

输入值

为了保证字符串的唯一性,您需要添加保证唯一的内容

  • 如果您有一个好的随机数生成器,则“随机值”是一个好的种子值
  • 时间是一个很好的附加值,但在高流量环境中它可能不是唯一的
  • 如果假设用户不打算在同一时间创建会话,则用户ID是一个很好的种子值
  • 唯一ID是系统保证唯一的。服务器通常会保证/验证在单服务器部署或分布式部署中是唯一的。一种简单的方法是添加机器ID和机器唯一ID。更复杂的方法是为机器分配密钥范围,并使用e每台机器管理其关键范围
我使用过的需要绝对唯一性的系统已经添加了一个服务器唯一id,它保证了一个项目是唯一的。这意味着不同服务器上的同一个项目会被视为不同的,这正是这里想要的

方法

选择一个或多个符合唯一性要求的输入值。如果您永远需要绝对唯一性,则您需要一些您可以控制并确保其唯一的东西,例如与机器关联的编号(不会与分布式系统中的其他编号冲突)。如果不需要绝对唯一性,可以将随机数与其他值(如时间)一起使用。如果需要随机性,请添加随机数


使用与您的用例匹配的字母表/编码。对于机器ID,十六进制和base 64等编码很流行。对于机器可读ID,对于不区分大小写的编码,我更喜欢base 32(Crockford)或者base36,对于区分大小写的编码,我更喜欢base58或base62。这是因为这些base32、36、58和62生成较短的字符串,并且(与base64相比)跨多种用途(例如URL、XML、文件名等)是安全的,并且不需要在不同的用例之间进行转换。

对于唯一的字符串使用
uniqid()

为了保证安全,使用散列算法

例如:


echo md5(uniqid())

对您的身份感到困惑asking@Dagon:很简单,我想在我的网站中使用随机字符串,其中我使用的随机字符串组合是安全的..?我投票支持
uniqid()
你说的安全是什么意思?使用剩余系统中的任何字符集(例如URL、数据库字段)允许。可能的字符越多越好。越长越好。日期和时间(选项3)在这里不会以任何方式提高安全性。
secure
md5
不能很好地坐在一起。
/*
    This function will return unique token string...
*/
function getUniqueToken($tokenLength = 10){
    $token = "";
    //Combination of character, number and special character...
    $combinationString = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789*#&$^";
    for($i=0;$i<$tokenLength;$i++){
        $token .= $combinationString[uniqueSecureHelper(0,strlen($combinationString))];
    }
    return $token;
}

/*
    This helper function will return unique and secure string...
*/
function uniqueSecureHelper($minVal, $maxVal) {
        $range = $maxVal - $minVal;
        if ($range < 0) return $minVal; // not so random...

        $log = log($range, 2);
        $bytes = (int) ($log / 8) + 1; // length in bytes
        $bits = (int) $log + 1; // length in bits
        $filter = (int) (1 << $bits) - 1; // set all lower bits to 1

        do {
            $rnd = hexdec(bin2hex(openssl_random_pseudo_bytes($bytes)));
            $rnd = $rnd & $filter; // discard irrelevant bits
        } while ($rnd >= $range);
        return $minVal + $rnd;
}