PHP中的AES-256并安全存储密钥?

时间:2015-05-22 21:06:54

标签: php encryption aes

我有以下代码......

   $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.初始化向量或数据是否包含冒号?

1 个答案:

答案 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。数据是否包含冒号并不重要,因为您可能从头开始搜索。