2013-12-21 99 views
1

我使用mysql和做AES_ENCRPYT函數來存儲一些機密數據。所以aes加密數據存儲字段是varchar但是當我插入一些數據並檢查數據庫時,它似乎像一些wiered字符i³£ÓXñÒOýpŠ ..但是,當我改變了數據類型顯示爲二進制字符串像69b3a3d358f1d24ffd708a0cafdbdbd8。我現在用PHP和MYSQLvarbinary或varchar保存AES加密數據

所以我的問題是

哪些數據類型必須用於存儲的AES加密的數據VARBINARY? varcharvarbinary。爲什麼?

另外如何做一個256字節的aes加密。

我發現了一些引用here指出

爲什麼我們用VARBINARY數據類型,而不是VARCHAR:

因爲AES_ENCRYPT()加密的字符串,並返回一個二進制字符串。

+0

我總是使用var binary,但char也會起作用。數據將相同 – exussum

+2

使用二進制類型。字符類型受到字符集轉換的自動化處理,並且你會得到一團糟。例如,假設表格中的數據是utf8,但客戶端編碼是latin1,所以MySql會自動將每個'é'字符(用拉丁字母E9表示)轉換爲utf8中的c3 + a9字節,並將這兩個字節存儲在表格中。然後想象另一個不支持'é'字符的編碼不是utf8和latin1的客戶端正在嘗試解密這個字符串 - 並且會弄得一團糟。 – krokodilko

回答

1

AES是分組密碼。像所有現代分組密碼一樣,AES只接受二進制輸入併產生二進制輸出。這意味着如果需要對字符串進行加密(例如UTF-8),則必須執行。如果要存儲結果,則必須使用(例如基數64)。有時一個實現已經爲你執行了這樣的功能,但大多數時候用戶將不得不自己做事。

現在密碼的輸出對於攻擊者來說應該是無法區分的。這意味着沒有理由將AES的輸出存儲在數據庫中的字符串中。從數據庫中檢索完畢後,您可以隨時將二進制文件轉換爲特定的編碼。因此將輸出存儲爲二進制。對於正常文本,varbinary將是最好的,因爲您事先不知道大小。

總之,只有在您需要時才執行字符串轉換。