使用mcrypt_dev_random生成256位令牌

时间:2014-01-01 03:11:10

标签: php encryption mcrypt

我想使用mcrypt创建一个256位令牌来设置为用户的cookie。

我已阅读了一些建议使用mcrypt DEV_RANDOM

的文章

我正在使用代码

$size = mcrypt_get_iv_size(MCRYPT_CAST_256, MCRYPT_MODE_CFB);
$iv = mcrypt_create_iv($size, MCRYPT_DEV_RANDOM);

但是当我输出令牌时我得到的结果是

ǡw��ӣ�:z���{d

这应该是什么样的?不,我不需要做什么来生成一个合适的令牌。

由于

1 个答案:

答案 0 :(得分:6)

使用bin2hex获得更“友好”的数据表示。 bin2hex会将您生成的字节转换为原始字符串的ASCII编码十六进制表示。

$size = mcrypt_get_iv_size(MCRYPT_CAST_256, MCRYPT_MODE_CFB);
$iv = mcrypt_create_iv($size, MCRYPT_DEV_RANDOM);

$hexIv = bin2hex($iv);

您获得奇怪输出的原因是因为您正在采用随机字节序列并尝试将其表示为某种人类可读文本,方法是将其视为以您应用程序的默认编码编码的字符串正在查看字符串(例如您的网络浏览器)。

示例:

$size = mcrypt_get_iv_size(MCRYPT_CAST_256, MCRYPT_MODE_CFB);
$iv = mcrypt_create_iv($size, MCRYPT_DEV_RANDOM);

echo "RAW IV: ";
echo $iv;
echo "\n Hex: ";
echo bin2hex($iv);

输出:

RAW IV: ª£2æ|%ì­E½ßy²ý
Hex: 0aaaa332e67c25ecad45bddf7919b2fd

此外,您还应注意以下事项:

    如果熵池耗尽,
  • MCRYPT_DEV_RANDOM将会阻止。
  • MCRYPT_DEV_URANDOM最有可能是更好的选择,因为它不会阻止。输出随机性较小,但大多数情况下都可以。
  • 替代函数是openssl_random_pseudo_bytes,对于您的用例,它执行与两个mcrypt_函数调用(使用MCRYPT_DEV_URANDOM)相同的功能。它不需要mcrypt扩展,只需要使用OpenSSL支持编译PHP。