创建随机哈希/字符串的最佳方法是什么?

Eri*_*tes 47 php hash session md5

为存储会话而生成哈希的最佳方法是什么?我正在寻找一种轻便,便携的解决方案.

Gaj*_*jus 66

bin2hex(mcrypt_create_iv(22, MCRYPT_DEV_URANDOM));
Run Code Online (Sandbox Code Playgroud)
  1. mcrypt_create_iv将为您提供随机的字节序列.
  2. bin2hex会将其转换为ASCII文本

示例输出:

d2c63a605ae27c13e43e26fe2c97a36c4556846dd3ef
Run Code Online (Sandbox Code Playgroud)

请记住,"最好"是一个相对术语.您需要在安全性,唯一性和速度之间进行权衡.上面的示例适用于99%的情况,但如果您正在处理特别敏感的数据,您可能想要了解MCRYPT_DEV_URANDOM和MCRYPT_DEV_RANDOM之间区别.

最后,有一个RandomLib "用于生成各种强度的随机数和字符串".

请注意,到目前为止,我假设您要生成一个随机字符串,这与从值中导出哈希值不同.对于后者,请参阅password_hash.

  • 只是一点PSA:`mcrypt_create_iv`在PHP 7.1.0中已被弃用.请改用[`random_bytes`](http://uk1.php.net/manual/en/function.random-bytes.php). (12认同)
  • 在PHP 7.2.0中删除:https://secure.php.net/manual/en/intro.mcrypt.php (3认同)

0b1*_*011 21

random_bytes()从PHP 7.0开始提供(或者使用5.2到5.6的polyfill):

$hash = bin2hex(random_bytes(16));
echo serialize($hash);
Run Code Online (Sandbox Code Playgroud)

输出:

S:32: "c8b2ca837488ff779753f374545b603c";

  • @Zortext `random_bytes()` 内置于 PHP 中(因此可能比您创建的任何内容都更快),并且可以相信它是加密安全的(与 **不是** 的 `rand()` 相比)。至于“bin2hex()”,您可以将二进制文件转换为其他内容,而不必过多担心影响安全性(这只会更耗时,但可以为最终用户节省一些字节)。最简单的可能是“base64_encode()”,它只比二进制输入大 33%。或者,您可以在映射到字符数组的循环中使用“random_int()”。 (3认同)
  • @Zortext如果您担心会话的安全性,请将“16”增加到一个让您感觉更好的数字。16 字节是 32 个十六进制字符,这意味着有“16^32”种不同的可能性,或 3.4e38 种可能性。因此,我建议弄清楚您要阻止的攻击面是什么样的,并相应地调整字节数。如果您关心的是 cookie/会话使用的存储,请使用“base64_encode()”,或使用“random_int()”和超过 64 个字符的数组自行推出。 (2认同)

Ant*_*ney 11

您可以使用PHP的内置散列函数,sha1以及md5.选择一个,而不是两个.

有人可能会认为使用两者sha1(md5($pass))都是一种解决方案.使用它们不会使您的密码更安全,它会导致冗余数据并且没有多大意义.

看看PHP Security Consortium:Password Hashing他们提供了一篇有关弱点的好文章,并通过散列提高了安全性.

随机数代表" ñ使用umbers 一次 ".他们正在请求用来防止未经授权的访问,他们送一个秘密密钥和检查,关键是用你的代码每次.

您可以在FullThrottle Development的PHP NONCE Library中查看更多信息

  • md5被黑了,使用sha1 (7认同)
  • 很老的线程,但SHA1现在正式破解!http://www.theverge.com/2017/2/23/14712118/google-sha1-collision-broken-web-encryption-shattered (6认同)
  • SHA1也可以被破坏(至少在理论上).有关详细信息,请参阅[哈希函数安全性摘要](https://en.wikipedia.org/wiki/Hash_function_security_summary).我选择SHA256或SHA512. (5认同)

z-b*_*oss 9

也许uniqid()是你需要的?

uniqid - 生成唯一ID

  • 你为什么要用md5?只需使用uniqid. (8认同)

Sim*_*ckx 7

从php 5.3.0开始,您可以使用openssl_random_pseudo_bytes生成伪随机字节串.您可以使用此函数并使用以下方法之一以某种方式将其转换为字符串:

$bytes = openssl_random_pseudo_bytes(32);
$hash = base64_encode($bytes);
Run Code Online (Sandbox Code Playgroud)

要么

$bytes = openssl_random_pseudo_bytes(32);
$hash = bin2hex($bytes);
Run Code Online (Sandbox Code Playgroud)

第一个将生成最短的字符串,包括数字,小写,大写和一些特殊字符(=,+,/).第二种方法将生成十六进制数字(0-9,af)


Zol*_*üle 5

使用random_bytes()如果它是可用的!

$length = 32;

if (function_exists("random_bytes")) {
    $bytes = random_bytes(ceil($length / 2));
    $token = substr(bin2hex($bytes), 0, $length)
}
Run Code Online (Sandbox Code Playgroud)

在 php.net 上检查