我想使用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
这应该是什么样的?不,我不需要做什么来生成一个合适的令牌。
由于
答案 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。