2012-09-29 30 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