【问题标题】:How do you create "good" random md5 hashes in php?如何在 php 中创建“好的”随机 md5 哈希?
【发布时间】:2014-07-25 02:28:51
【问题描述】:

在某些情况下,我需要创建随机 md5 哈希。你知道最好/最安全的方法是什么吗?

一些用例

  • 验证电子邮件地址
  • 重置密码
  • 某种用于身份验证的会话 ID,而不是密码(例如:当有人点击“记住我”时,我不想将通行证存储在 cookie 中)

背景

我知道rand() 不应该用于安全相关的应用程序。出于这个原因,我选择了:

md5( uniqid(mt_rand(),true) );

现在我在php manual 中读到关于uniqid(),它不得用于安全目的。哪种是有意义的,因为它通常只给出时间戳之类的东西。

但是与随机前缀 - mt_rand() 结合时是否可以,就像我一样,或者在这种情况下应该使用更好的东西吗?

提前谢谢!

【问题讨论】:

  • 如果有帮助,请参阅 this
  • 可以使用base64_encodephp.net/manual/en/function.base64-encode.php进行编码。
  • @Log1cツ:谢谢,里面有很多东西!最重要的可能是函数openssl_random_pseudo_bytes() 作为替代。
  • @Prava-MindfireSolutions:编码不是问题,它的数据也是问题(base64 也可以很容易地被解码/“反转”)。

标签: php hash md5 uniqueidentifier


【解决方案1】:

您不需要“MD5 哈希”,您只需要一个随机字符串。这些根本不需要与 MD5 有任何关系。所以你所需要的只是一个好的 PRNG。例如:

$token = mcrypt_create_iv($rawLength, MCRYPT_DEV_URANDOM);
// or
$token = openssl_random_pseudo_bytes($rawLength);
// or
$token = file_get_contents('/dev/urandom', false, null, 0, $rawLength);

然后base64_encodebin2hex原始值得到一个ASCII字符串。

【讨论】:

  • 这实际上是一个很好的答案!只是我的问题,我的服务器在 Windows 机器上运行,所以没有/dev/urandom :-/
  • 嗯,有足够的替代品... :) 实际上,看看这个库,它有很多后备:github.com/ircmaxell/password_compat/blob/master/lib/…
  • 这看起来很不错,会给它一个更彻底的外观。只是出于兴趣,您如何看待我与mt_rand() 结合uniqid() 的原始代码?精确微秒加上“某种”随机算法的组合对我来说似乎并不算太​​糟糕,还是我错过了什么?
  • 在实践中可能没问题。然而,IMO 它正在从错误的角度接近它。您正在从一个好的但不是很好的 PRNG 生成一个带有 some 熵的值,并将其作为种子提供给另一个好的但不是那么好的 PRNG,然后用一个 not - 非常棒的哈希,所有这些都只是为了逐渐减少熵,如果有的话。您应该只使用高熵源开始并完成它。
  • 再一次,只是bin2hexbase64_encode 这些字节。字节已经是随机的,您只是想以不同的基数显示它们。您基本上将它们作为原始基数 256 获取,并且您希望以基数 16(十六进制)或基数 64 表示它们以使它们可读/可传输。
【解决方案2】:

我刚刚完成了一个相当健壮的 Bash 脚本的开发,它可以生成质量不错的 md5sum。你可以找到它https://code.google.com/p/gen-uniq-id/source/browse/gen_uniq_id.bsh

它具有以下特点:

时间戳精确到纳秒,

用户可修改的从 /dev/urandom 收集的数据量(默认为 0.25 秒),

用户可修改的收集到的鼠标移动数据量(默认为 0.25 秒,只需使用 xinput --list 并使用 -M<your_mouse_device_id> 运行一次),

可动态修改的文本语句,可设置为默认值或随每次调用动态发送,例如-s"$(history | tail -5)"

您可能可以轻松地移植到 PHP 或通过 shell_exec 从 PHP 调用它:
$random_md5sum = shell_exec('/path/to/gen_uniq_id.bsh -m1 -r1 -s"favorite quote$(history | tail -5)"');

【讨论】:

    猜你喜欢
    • 2015-01-05
    • 2011-08-17
    • 1970-01-01
    • 1970-01-01
    • 2017-05-04
    • 2011-11-29
    • 2012-02-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多