【问题标题】:php using mcrypt_create_ivphp 使用 mcrypt_create_iv
【发布时间】:2012-03-15 20:32:37
【问题描述】:

我想在 PHP 中创建一个随机整数和字符串,所以我决定使用 mcrypt_create_iv。它是用手册编写的,它使用 /dev/random 和 /dev/urandom 来表示随机性,但我找不到关于如何使用此函数生成随机 Int 和 String 的简单教程。我尝试了一些代码,但这个函数给了我不可读的字符。那么请你给我一个简单的例子来说明我如何正确使用它?

【问题讨论】:

  • mcrypt_create_iv 的目的不是生成随机字符串。它的目的是生成一个加密初始化向量(因此 mcryptiv)。
  • 如果你想要一个更小的字符集,在 mcrypt_create_iv 的输出上运行 base64_encode 也是一个选项。
  • 从 PHP 7.2 开始,Mcrypt 现在是 removed,您将只想使用 PHP 的内置函数 random_intrandom_bytes,后者可以编码为十六进制表示,Base64等

标签: php string random int mcrypt


【解决方案1】:

首先,你想如何使用随机字符串,你想用它们做什么?如果是为密码生成盐,您可以使用此函数生成比 uniqid() 或 mt_rand() 生成的更好的随机字符串。请参阅Secure Password Hashing 并查看下面的代码,了解如何使用 mcrypt_create_iv()) 生成随机字符串。如果您想要用于用户识别的字符串,为什么不试试UUID。 单独使用 mcrypt_create_iv 只会生成不可读的字符。要将那些不可读的字符“转换”为可读的字符,请使用 bin2hex 函数,如下所示:

$random_string = bin2hex(mcrypt_create_iv(30, [MCRYPT_DEV_RANDOM|MCRYPT_DEV_URANDOM|MCRYPT_RAND]));

“30”是您想要获得的初始化向量的大小。请记住,在 PHP 版本低于 5.3.0 的 Windows 机器上使用 MCRYPT_DEV_URANDOM 和 MCRYPT_DEV_RANDOM 将不起作用。对于这种情况,请改用 MCRYPT_RAND。

【讨论】:

  • 谢谢,你是第一个提出简洁明了的例子,我在网上找不到。
【解决方案2】:

如果要生成随机数,请使用mt_rand

$random = mt_rand(0, 999999);

如果你想要一个字符串,你可以通过一个散列函数传递得到的整数:

$random = mt_rand(0, 999999);
$random_string = sha1($random);

mcrypt_create_iv 用于密码学。这与您的要求完全无关。

如果您希望在安全组件(盐、密码等)中使用随机字符串,请像这样从/dev/urandom 读取:

$random = file_get_contents('/dev/urandom', false, null, 0, 10);

...其中10 是长度,然后像这样转换:

$string = bin2hex($random);
$number = current(unpack('L', $random));

【讨论】:

  • 谷歌它,你会发现 php 大师说,这不是安全的方法。唯一安全的方法是使用 /dev/urandom
  • @user1228636:安全是相对的。您没有提及您想要它的用途,因此除非您这样做,否则我不在乎根据您的标准它是否安全。你想要随机数吗?使用mt_rand。你想读/dev/urandom,就读吧。
  • 我只是不知道如何从 /dev/urandom 读取。所以我认为 mcrypt_create_iv 正在自动完成这项工作。我错了……
  • @user1228636: mcrypt_create_iv 这样做,但这不是它的用途。如果您能说出您打算如何使用这些随机数/字符串,这实际上会有所帮助。然后我实际上可以判断使用mt_rand是否安全。
  • 我想用它来加盐,我需要整数和字符串的最佳随机性。如果给我一个使用它来完成我的工作的例子会很酷。
【解决方案3】:

rand ( int $min , int $max ) 将其用于随机数,对于字符串,使用随机数的 md5 或 sha1 散列;

【讨论】:

  • 我想使用 /dev/urandom 因为它是最安全的方法。这种方法根本不安全
猜你喜欢
  • 2014-01-28
  • 2012-09-14
  • 2012-08-27
  • 1970-01-01
  • 2014-02-11
  • 2019-09-27
  • 2013-12-18
  • 1970-01-01
  • 2016-05-03
相关资源
最近更新 更多