【问题标题】:Mysql and Mcrypt Problem with PHPPHP 的 Mysql 和 Mcrypt 问题
【发布时间】:2011-11-18 03:21:59
【问题描述】:

我已经看到这个问题问了几次,但我不知道我将如何在这里问它......希望你们没问题。

基本上我有这个脚本可以正常工作,并且可以顺利打印我的结果:

$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。这就是问题所在吗?

【问题讨论】:

  • 改用 blob/二进制字段。 text/varchar 字段受字符翻译的影响,而 blob 则逐字传递。
  • @Marc S/他正在使用base64_encode()

标签: php mysql mcrypt


【解决方案1】:

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

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

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

【讨论】:

  • 我将如何保存它?我也可以把它放到我的数据库中吗?
  • @Jascha 当然,只要你记得哪个IV属于哪个密文。
  • 好的,所以,我将添加一个额外的“二进制”字段(我假设)将 IV 存储在加密数据旁边,并调用它与存储在某处的密钥一起解密否则...
  • 是的,如果您将 iv 存储在不同的字段中并在解码时调用它就可以了。
猜你喜欢
  • 2016-09-21
  • 2011-05-08
  • 1970-01-01
  • 2013-01-06
相关资源
最近更新 更多