首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在PHP中从0-X获取加密强整数?

问如何在PHP中从0-X获取加密强整数?
EN

Stack Overflow用户
提问于 2013-11-02 01:25:33
回答 3查看 133关注 0票数 6

我想在PHP中生成随机的字母数字字符串。它们将用于随机数强度很重要的地方(URL中的公共可见in等)。

据我所知,在PHP中,加密的强随机性的主要来源是openssl_random_pseudo_bytes()。但是,这将返回一个字节数组,而不是字母数字字符。

要将它们转换为字母数字,我可以对它们进行哈希运算(这会产生一个包含有限十六进制字符的超出必要长度的字符串),也可以对它们进行base64_encode()运算(这会产生一个包含+、/和=的字符串,而不是字母数字)。

所以我认为我可以使用随机字节作为熵的来源,并生成我自己的仅由字符0-9a-zA-Z组成的字符串。

然后问题就变成了-如何将256个不同的值(一个字节的输入)转换为62个不同的值(一个字符的输出)。在某种程度上,所有62个字符的可能性都是一样的。(否则将有8个字符比其他字符出现的频率更高)。

或者,也许我应该完全使用另一种方法?我希望我的字符串尽可能短(例如,20个字符或更短的URL更好),并且只由字母数字字符组成(这样它就不需要在任何地方进行特殊转义)。

EN

回答 3

Stack Overflow用户

发布于 2013-11-02 01:32:58

你可以实现你自己的base64编码。如果你能允许两个特定的符号--它们可以是任何东西,例如.和-,那就没什么关系了。它甚至可以是他们中的一个的空间。在任何情况下,您都会这样做:

代码语言:javascript
复制
$alphabet = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ.-";
// using . and - for the two symbols here
$input = [123,193,21,13]; // whatever your input it, I'm assuming an array of bytes
$output = "";
foreach($input as $byte) {
    $output .= $alphabet[$byte%64];
}

假设随机输入,所有字符出现的概率相等。

也就是说,如果您不允许纯字母数字以外的任何符号,请从$alphabet中剪切符号,并使用%62而不是%64。虽然这确实意味着您对通过7的字符0有一点偏见,但我认为这还不够重要,不必担心。

票数 2
EN

Stack Overflow用户

发布于 2013-11-02 01:46:42

我在php.net上的用户评论中找到了这个函数。

代码语言:javascript
复制
     function crypto_rand($min,$max) {
         $range = $max - $min;
         if ($range == 0) return $min; // not so random...
         $length = (int) (log($range,2) / 8) + 1;
         return $min + (hexdec(bin2hex(openssl_random_pseudo_bytes($length,$s))) % $range);
     }

然后做像这样的事情

代码语言:javascript
复制
 for($i=0; $i<20; $i++)
  {
    $string.= chr(crypto_rand(1,26)+96); //or +64 for upper case
  }

或者类似的。

票数 0
EN

Stack Overflow用户

发布于 2013-11-02 02:11:46

注意:这是错误的!我留下这个尝试的答案,仅供参考。

(31 * 256) % 62 =0

对于每个输出字母数字字符,生成31个随机值。将这31个值相加,取模数62。

有点残酷,但这是我能想到的唯一“数学上正确的”选项:)

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19731965

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档