我发现了一对加密和解密函数,看起来它们遵守我迫切希望完全理解的所有数据安全规则,但可能无法在没有博士学位的情况下使用。
当我使用相同的IV加密和解密同一页面上的内容时,它们的效果非常好。
但是当我尝试将结果保存到SQL数据库然后再将其拉回并解密时,它就不起作用了。
$key = "secretsecret";
$iv = mcrypt_create_iv(mcrypt_get_iv_size(MCRYPT_RIJNDAEL_128, MCRYPT_MODE_CBC), MCRYPT_DEV_RANDOM);
function encrypt($key, $text, $iv) {
return trim(base64_encode(mcrypt_encrypt(MCRYPT_RIJNDAEL_128, $key, $text, MCRYPT_MODE_CBC, $iv)));
}
function decrypt($key, $text, $iv) {
return trim(mcrypt_decrypt(MCRYPT_RIJNDAEL_128, $key, base64_decode($text), MCRYPT_MODE_CBC,$iv));
}
$text = "the text to encrypt";
echo "Plain Text: " . $text . "<br><br>";
$encrypted = encrypt($key, $text, $iv);
echo "Encrypted Text: " . $encrypted . "<br><br>";
echo "Decrypted Text: ". decrypt($key, $encrypted, $iv) . "<br><br>"; //this works fine
//save encrypted text to SQL
mysql_query("UPDATE table SET test='".addslashes($encrypted)."' WHERE id='1'");
然后,如果在另一个页面视图中,我将文本拉回来并尝试:
echo "Decrypted Text: ". decrypt($key, $textFromSQL, $iv) . "<br><br>";
我得到了胡言乱语。我需要做些什么来使用不同的IV正确解密文本?
答案 0 :(得分:3)
您需要在解密中使用与在enryption中相同的Initialization Vector(IV)。这意味着您需要将IV存储在数据库中。
与钥匙不同,IV不需要保密。
这样的事情:
mysql_query("UPDATE table SET test='".addslashes($encrypted)."', IV='".addslashes($IV)."' WHERE id='1'");
然后,当你解密数据时,使用存储的IV。