创建随机哈希/字符串的最佳方法是什么?作为十六进制字符串作为 base64 字符串

2022-08-30 09:10:55

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


答案 1
bin2hex(mcrypt_create_iv(22, MCRYPT_DEV_URANDOM));
  1. mcrypt_create_iv将为您提供一个随机的字节序列。
  2. bin2hex 会将其转换为 ASCII 文本

输出示例:

d2c63a605ae27c13e43e26fe2c97a36c4556846dd3ef

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

最后,还有一个RandomLib“用于生成各种强度的随机数和字符串”。

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


答案 2

random_bytes() 从 PHP 7.0 开始可用(或者将此 polyfill 用于 5.2 到 5.6)。它在加密上是安全的(相比之下,它不是),可以与 、 或任何其他将二进制转换为对您的用例安全的字符串的函数结合使用。rand()bin2hex()base64_encode()

作为十六进制字符串

bin2hex() 将生成一个十六进制字符串,该字符串的字符数是随机字节数的两倍(每个十六进制字符表示 4 位,而一个字节中有 8 位)。它将仅包含来自 的字符,并且长度将始终以 2 为增量(正则表达式:)。abcdef0123456789/^([a-f0-9]{2})*$/

$random_hex = bin2hex(random_bytes(18));
echo serialize($random_hex);

s:36:“ee438d1d108bd818aa0d525602340e5d7036”;

作为 base64 字符串

base64_encode() 将导致字符串比随机字节数长 33%(每个 base64 字符表示 6 位,而一个字节中有 8 位)。它的长度将始终以 4 为增量,用于填充字符串的末尾,以及以下列表中用于对数据进行编码的字符(不包括我为提高可读性而添加的空格):=

abcdefghijklmnopqrstuvwxyz
ABCDEFGHIJKLMNOPQRSTUVWXYZ
0123456789
/+

要充分利用可用空间,最好提供 3 到 的增量。生成的字符串将匹配 ,尽管只有在向 提供不以 3 为增量的数字时,才能在末尾显示为 或 并且仅当向 。random_bytes()/^([a-zA-Z\/+=]{4})*$/====random_bytes()

$random_base64 = base64_encode(random_bytes(18));
echo serialize($random_base64);

s:24:“ttYDDiGPV5K0MXbcfeqAGniH”;


推荐