如何在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;
}