当前位置: 首页 > 面试题库 >

在PHP中生成随机密钥的最佳方法是什么?

万俟穆冉
2023-03-14
问题内容

我正在寻找创建一个可重用的函数,该函数将生成一个随机密钥,该随机密钥具有选定长度(可从2到1000+)的可打印ACSII字符。我认为可打印的ASCII字符应为33-126。它们的密钥不需要完全唯一,只要在完全相同的毫秒内生成就可以唯一(因此uniqid()不起作用)。

我正在考虑将结合使用,chr()并且mt_rand()可能会起作用。

这是要走的路,还是其他最佳方法?

编辑: uniqid()也将不起作用,因为它没有长度参数,这就是PHP给您的。

我的想法 :这是我想出的:

function GenerateKey($length = 16) {
    $key = '';

    for($i = 0; $i < $length; $i ++) {
        $key .= chr(mt_rand(33, 126));
    }

    return $key;
}

这有什么问题吗?

另一个编辑: 大多数其他问题与密码生成有关。我希望有一个更广泛的角色,我不关心1VS l。我希望最大数量的可能键。

注意:生成的密钥不一定必须是加密安全的。


问题答案:

更新(12/2015):对于PHP7.0,您应该使用random_int()而不是,mt_rand因为它提供了“加密安全值”

就个人而言,我喜欢使用,sha1(microtime(true).mt_rand(10000,90000))但是您正在寻找更多的可定制方法,因此请尝试使用此功能

function rand_char($length) {
  $random = '';
  for ($i = 0; $i < $length; $i++) {
    $random .= chr(mt_rand(33, 126));
  }
  return $random;
}

不过,这可能会比uniqid(),md5()或sha1()慢得多。

编辑: 看来你先来了,对不起。:D

编辑2: 我决定使用PHP 5和eAccelerator在我的Debian机器上做一个不错的小测试(请使用长代码):

function rand_char($length) {
  $random = '';
  for ($i = 0; $i < $length; $i++) {
    $random .= chr(mt_rand(33, 126));
  }
  return $random;
}

function rand_sha1($length) {
  $max = ceil($length / 40);
  $random = '';
  for ($i = 0; $i < $max; $i ++) {
    $random .= sha1(microtime(true).mt_rand(10000,90000));
  }
  return substr($random, 0, $length);
}

function rand_md5($length) {
  $max = ceil($length / 32);
  $random = '';
  for ($i = 0; $i < $max; $i ++) {
    $random .= md5(microtime(true).mt_rand(10000,90000));
  }
  return substr($random, 0, $length);
}

$a = microtime(true);
for ($x = 0; $x < 1000; $x++)
  $temp = rand_char(1000);

echo "Rand:\t".(microtime(true) - $a)."\n";

$a = microtime(true);
for ($x = 0; $x < 1000; $x++)
  $temp = rand_sha1(1000);

echo "SHA-1:\t".(microtime(true) - $a)."\n";

$a = microtime(true);
for ($x = 0; $x < 1000; $x++)
  $temp = rand_md5(1000);

echo "MD5:\t".(microtime(true) - $a)."\n";

结果:

Rand:   2.09621596336
SHA-1:  0.611464977264
MD5:    0.618473052979

因此,如果您想提高速度(而不是完整字符集),我的建议是坚持使用MD5,SHA-1或Uniqid(我尚未测试过。)



 类似资料:
  • 问题内容: 在Python中,生成一些随机文本以添加到要保存到服务器的文件(名称)的一种好方法或最佳方法是,只是确保它不会被覆盖。谢谢! 问题答案: Python具有生成临时文件名的功能,请参见http://docs.python.org/library/tempfile.html。例如: 每次调用都会生成一个不同的临时文件,并且可以使用属性访问其名称,例如: 一旦拥有唯一的文件名,它就可以像任何

  • 问题内容: 我正在尝试在php中生成一个随机密码。 但是我得到所有的’a’s,返回类型是数组类型,我希望它是一个字符串。有关如何更正代码的任何想法? 谢谢。 问题答案: 安全警告 :不是加密安全的伪随机数生成器。寻找其他地方以在PHP中生成加密安全的伪随机字符串。 试试这个(使用代替,因为在字符串上总是):

  • 问题内容: 我是Android开发和实现SSLSockets的新手。经过一些挖掘后,我能够设置一个可以正常工作的简单服务器/客户端。我觉得该实现可能需要花费一些工作,并且在不使用纯文本格式的情况下困扰于如何将密码加载到密钥库中。这是客户端上的一些代码。如您所见,我已将密码硬编码到本地变量中。有没有更好的方法来加载密钥库密码,所以我在代码中没有纯文本格式? 更新: 事实证明,客户端根本不需要知道密钥

  • 问题内容: 对于一个项目,我需要一种创建数千个随机字符串同时保持较低冲突的方法。我正在寻找长度只有12个字符且只有大写的字符。有什么建议? 问题答案: 码: 输出: 5个例子: 编辑: 如果你只需要数字,使用恒定的,而不是从一个模块。 3个例子:

  • 问题内容: 除了MYSQL中的行数据外,获取行的排名的最佳方法是什么? 例如,说我有一个学生名单,我想在GPA上排名。我知道我可以按GPA排序,但是让MYSQL在返回的行数据中也返回排名的最快方法是什么? 问题答案: 这将返回排名为

  • 问题内容: 类似于[a-zA-Z0-9]字符串: na1dopW129T0anN28udaZ 或十六进制字符串: 8c6f78ac23b4a7b8c0182d 长期以来,我的意思是2K和更多字符。 问题答案: 这在我的盒子上大约有200MBps。有明显的改进空间。 您只需要生成所需的字符串即可。显然,您可以在途中或其他情况下调整字符集。 这个模型的好处是,它只是一个,因此您可以使用它制作任何东西。