Ark*_*ken 1 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);
Run Code Online (Sandbox Code Playgroud)
但是当我输出令牌时我得到的结果是
?w????:z???{d
Run Code Online (Sandbox Code Playgroud)
这是它应该是什么样子?不,我不需要做什么来生成一个合适的令牌.
谢谢
使用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);
Run Code Online (Sandbox Code Playgroud)
您获得奇怪输出的原因是因为您正在采用随机字节序列并尝试将其表示为某种人类可读文本,方法是将其视为以您正在查看的应用程序的默认编码编码的字符串.字符串(例如你的网络浏览器).
例:
$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);
Run Code Online (Sandbox Code Playgroud)
输出:
RAW IV: ª£2æ|%ìE½ßy²ý
Hex: 0aaaa332e67c25ecad45bddf7919b2fd
Run Code Online (Sandbox Code Playgroud)
此外,您应该注意以下事项:
MCRYPT_DEV_RANDOM 将阻止熵池耗尽.MCRYPT_DEV_URANDOM很可能是一个更好的选择,因为它不会阻止.输出随机性较小,但对于大多数用途来说这很好.openssl_random_pseudo_bytes,对于您的用例,它执行与两个mcrypt_函数调用(with MCRYPT_DEV_URANDOM)相同的功能.它不需要mcrypt扩展,只有PHP是使用OpenSSL支持编译的.