PHP的Mysql和Mcrypt问题

时间:2011-09-15 18:32:25

标签: php mysql mcrypt

我已经看过几次了,但不知道我将如何在这里问这个问题......希望你和我们一起做好。

基本上我有这个脚本可以正常工作,并且会毫不费力地打印我的结果:

$algorithm = MCRYPT_BLOWFISH;
$mode = MCRYPT_MODE_CFB;
$iv = mcrypt_create_iv(mcrypt_get_iv_size($algorithm, $mode), MCRYPT_DEV_URANDOM);
$key = 'Wassup';
$data = 'I am a guy';

$enc_data = rtrim(mcrypt_encrypt($algorithm,$key,$data,$mode,$iv));
$plain_text = base64_encode($enc_data);
echo $plain_text . "\n";

// OUTPUTS: 6m3D5qSrfz3w6pKuuybs

$enc_data = base64_decode($plain_text);
$decoded = mcrypt_decrypt($algorithm,$key,$enc_data,$mode,$iv);
echo $decoded;

// OUTPUTS: I am a guy

这很完美。现在......而不是只是立即输出我输入的内容,我试图将该信息存储在我的数据库中以便稍后解密。

我可以在表格行中看到加密的字符串:6m3D5qSrfz3w6pKuuybs。所以,我确信它会很好......

当我查询它时它看起来是一样的, 但现在当我解码和解密时,我会得到类似的东西:ÝÄ/ $ÍñËt05883700

表字段设置为VARCHAR(255)utf8_general_ci。这是问题所在吗?

1 个答案:

答案 0 :(得分:5)

您确定在加密和解密时使用相同的初始化向量(IV)吗?

请注意,您还需要保存IV并在解密时使用它。也不要在密文上使用rtrim()

话虽如此,您可以使用BINARY(或VARBINARY)字段来存储您的密文(和IV),因此您无需对其进行base64编码。它可以节省33%的存储空间。