我有以下代码......
$iv_size = mcrypt_get_iv_size(MCRYPT_RIJNDAEL_128, MCRYPT_MODE_CBC);
$iv = mcrypt_create_iv($iv_size, MCRYPT_DEV_URANDOM);
$key = pack("H*", "Insert64CharacterStringHere");
$value = mcrypt_encrypt(MCRYPT_RIJNDAEL_128, $key, $value, MCRYPT_MODE_CBC, $iv);
$value = $iv . ":" . $value;
我正在使用它来加密我网站上的AES-256数据。我存储初始化向量与被加密的数据,并且数据和初始化向量之间是冒号,以便我可以稍后将字符串分解为初始化向量和数据,然后解密。
我想知道的是存储密钥的位置。如果我将它存储在同一个数据库中,它几乎就像不加密地保留数据一样不安全。我有一种感觉,把钥匙放在我的PHP代码中的某处,就像不安全一样。
密钥应存放在何处?这是存储初始化向量的适当方法吗?我可以安全地使用冒号作为分隔符吗? I.E.初始化向量或数据是否包含冒号?
答案 0 :(得分:4)
部分答案......
这是存储初始化向量的合适方法吗?我可以安全地使用冒号作为分隔符吗? I.E.初始化向量或数据是否包含冒号?
对于AES(在CBC模式下),IV总是16个字节。没有必要有分隔符。您可以安全地使用substr()
函数在解密之前拆分IV和密文:
$iv = substr($encrypted, 0, 16);
$ct = substr($encrypted, 16);
如果您处于多字节字符串环境中,则应使用mb_substr() like this
:
$iv = mb_substr($encrypted, 0, 16, '8bit');
$ct = mb_substr($encrypted, 16, mb_strlen($encrypted, '8bit'), '8bit');
事实上,由于IV是随机生成的,因此在某个时间点可能包含冒号。每16次加密的预期值为1。数据是否包含冒号并不重要,因为您可能从头开始搜索。