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

时间:2015-06-13 06:34:56

标签: php unique-key

我想添加随机字符串作为表单提交的标记,它永远是唯一生成的。我花了很多时间与谷歌,但我很困惑使用哪种组合?

当我用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.

我可以使用哪种组合?

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

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

6 个答案:

答案 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。这可能是你正在寻找的。

我认为最好将您重定向到之前提出的具有更多实质性答案的问题。您会找到很多选项。

答案 3 :(得分:1)

以下是一些注意事项:

<强>字母

可以将字符数视为编码的alphabet。它本身不会影响弦强度,但是较大的字母(数字,非字母数字等)确实允许较短的相似强度的弦(又名keyspace),因此它可以使用它。如果你正在寻找更短的字符串,那就很有用。

输入值

为了保证您的字符串是唯一的,您需要添加一些保证唯一的字符串。

  • 如果您有一个好的随机数生成器,随机值是一个很好的种子值
  • 时间是一个很好的种子价值,但在高流量环境中可能并不是唯一的
  • 如果您认为用户不能在同一时间创建会话,则用户ID是一个很好的种子值
  • 系统保证的唯一ID是唯一的。这通常是服务器在单个服务器部署或分布式部署中保证/验证的内容。一种简单的方法是添加机器ID和机器唯一ID。更复杂的方法是为机器分配关键范围,让每台机器管理其关键范围。

我曾经使用过的系统需要绝对唯一性,它添加了一个服务器唯一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())