1

我使用 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;
?>

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

4

1 回答 1

0

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

您应该改用BINARY 或 VARBINARY数据类型,它们完全是为了存储二进制数据而制作的。

另一种方法是在将数据存储为字符数据类型之前对数据进行base64_encode ,并在从数据库中获取数据时对数据进行base64_decode 。这将对数据进行编码,以便可以将加密的数据存储在 varchar/char 数据类型中(尽管它会使数据稍长一些,因此请注意这一点)

于 2012-09-29T17:54:16.667 回答