使用openssl破坏数据的mysql

时间:2012-09-29 17:51:29

标签: php mysql encryption openssl corruption

我使用openssl加密文本,然后将其放入mysql数据库。 这样可以正常工作,但是对于长文本,解密的文本会被破坏。

我个人认为这是由于mysql将此文本保存到数据库中的方式,加密文本中有很多字母数字字符。但我不确定。 另外我不知道在mysql中使用哪种排序规则,现在我将其设置为* utf8_unicode_ci *,但仍然存在数据损坏。

这里可以看到一个实例:http://todolist.x10.mx

Username: example
Password: password

要查看损坏的数据,请点击Download Backup

在代码下面,当然$encrypted会保存到数据库中。没有数据库,此代码可以正常工作。

<?php
  $source = 'very long text';
  $iv = "1234567812345678";
  $pass = 'difficultpassphrase';
  $method = 'aes-256-ofb';

  $encrypted = openssl_encrypt ($source, $method, $pass, true, $iv);  
  echo $encrypted;

  $decrypted = openssl_decrypt ($encrypted, $method, $pass, true, $iv);
  echo $decrypted;
?>

提前感谢您的时间和专业知识。

1 个答案:

答案 0 :(得分:0)

要以二进制形式存储加密内容,您不能使用带编码的字符类型,因为编码很可能会“破坏”您的数据。

您应该使用BINARY or VARBINARY数据类型,它们完全是为了存储二进制数据。

替代方法是在将数据存储到字符数据类型之前base64_encode数据,并在从数据库中提取数据时base64_decode数据。这将对数据进行编码,以便加密数据可以存储在varchar / char数据类型中(尽管它会使数据稍长一些,所以要注意这一点)