2012-09-29 29 views
1

我使用openssl来加密文本,然后把它放到mysql数据库中。 这工作正常,但是对于长文本,解密的文本会损坏。使用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; 
?> 

预先感谢您的时间和专业知识。

回答

0

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

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

另一种方法是将数据存储在字符数据类型中之前的数据为base64_encode,当您从数据库中获取数据时,数据为base64_decode。这将对数据进行编码,以便加密数据可以存储在varchar/char数据类型中(尽管它会使数据稍微长一点,所以要小心)

+0

我使用base64_encode/decode,正如你所提到的那样,仍然存在。非常聪明的想法,但。 我使用base64_encode的mysql_real_escape_string,也许这是导致可溶性?我认为这不太可能。 mysql_real_escape_string(base64_encode($ encrypted)) 通过将字段设置为二进制或varbinary,字段长度自动变为1,当我尝试使其变大时我收到一个错误。 我将其设置回blob – user1557314

+0

我发现问题:我在显示笔记之前执行了stripslashes()。 – user1557314