我想添加随机字符串作为表单提交的标记,它永远是唯一生成的。我花了很多时间与谷歌,但我很困惑使用哪种组合?
当我用Google搜索时,我发现了很多方法:
1) Combination of character and number.
2) Combination of character, number and special character.
3) Combination of character, number, special character and date time.
我可以使用哪种组合?
我可以生成多少个随机字符串字符。?
任何其他安全的方法请告诉我。?
答案 0 :(得分:1)
根据你的需要,你绝对可以获得更多的爱好者,但我会把它扔出去,因为这是我经常使用的东西,比如你所描述的东西:
md5(rand());
快速,简单,易记。因为它是十六进制的,所以它与其他人很好地搭配。
答案 1 :(得分:1)
尝试使用函数qmake
的代码,它返回长度为10的唯一字符串(默认值)。
getUniqueToken()
使用此代码(两个函数),您可以通过传递/*
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;
}
之类的int参数来增加字符串长度。
我使用你的第二个想法(字符,数字和特殊字符的组合),你在谷歌搜索后改进。我希望我的例子能帮到你。
答案 2 :(得分:1)
请参阅此SO Protected Question。这可能是你正在寻找的。 p>
我认为最好将您重定向到之前提出的具有更多实质性答案的问题。您会找到很多选项。
答案 3 :(得分:1)
以下是一些注意事项:
<强>字母强>
可以将字符数视为编码的alphabet
。它本身不会影响弦强度,但是较大的字母(数字,非字母数字等)确实允许较短的相似强度的弦(又名keyspace
),因此它可以使用它。如果你正在寻找更短的字符串,那就很有用。
输入值
为了保证您的字符串是唯一的,您需要添加一些保证唯一的字符串。
我曾经使用过的系统需要绝对唯一性,它添加了一个服务器唯一ID,以确保项目是唯一的。这意味着不同服务器上的相同项目将被视为不同,这就是这里所需要的。
<强>方法强>
选择一个符合您对唯一性要求的输入值。如果你需要永远的绝对唯一性,那么你需要一些你确定是独一无二的东西,例如:机器关联号码(与分布式系统中的其他人不会发生冲突)。如果您不需要绝对唯一性,则可以使用带有其他值的随机数,例如时间。如果您需要随机性,请添加随机数。
使用与您的用例匹配的字母/编码。对于机器ID,十六进制和base 64等编码很受欢迎。对于机器可读的id,对于不区分大小写的编码,我更喜欢base32(Crockford)或base36,对于区分大小写的编码,我更喜欢base58或base62。这是因为这些base32,36,58和62产生较短的字符串,并且(相对于base64)在多种用途(例如URL,XML,文件名等)中是安全的,并且不需要在不同用例之间进行转换。
答案 4 :(得分:0)
你应该选择3个选项。因为它有日期和时间所以它每次都变得独一无二。 对于方法,你试过
str_shuffle($ string)
每次从$ string生成随机字符串。 结束然后使用substr
($ string,start,end)
将其削减。 如果您想要日期和时间,请结束,然后将结果字符串与其连接。
答案 5 :(得分:-1)
使用唯一字符串uniqid()
。
为了确保安全,请使用散列算法
例如:
echo md5(uniqid())