2013-04-12 30 views
4

我正在研究一個接受用戶通過文本區域輸入的PHP應用程序。它將被加密存儲在數據庫中(使用AES_ENCRYPT)。在BLOB或VARBINARY中使用MySQL中的加密數據?

我應該使用BLOB還是VARBINARY字段?對任何一種領域都有性能影響?

+0

AES_ENCRYPT()和AES_DECRYPT()使加密和使用官方AES(高級加密標準)算法,以前已知爲具有128位密鑰長度「的Rijndael。」編碼的數據進行解密時使用,但你可以通過修改源將其擴展到256位。我們選擇了128位,因爲它速度更快,而且對於大多數目的而言它足夠安全。 http://dev.mysql.com/doc/refman/5.1/en/encryption-functions.html#function_aes-encrypt – zod

+0

http://stackoverflow.com/questions/504268/mysql-binary-against-non-binary- for-hash-id – zod

回答

9

兩個BLOB和VARBINARY是「字符串」的數據類型,該存儲二進制字符串(有效字節數組),而不是通常的字符串類型,其存儲字符的字符串,字符集編碼等

在大多數方面,您可以將BLOB列視爲VARBINARY列,可以儘可能大。

BLOB從VARBINARY不同之處在於以下方面:

  • 有當值被存儲或檢索沒有尾隨空間去除對BLOB列。
  • 對於BLOB列上的索引,您必須指定一個索引前綴長度。
  • BLOB列不能有DEFAULT值。

使用BLOB,因爲如果你的加密值發生在一個空間字節(十六進制20)結束,將它與VARBINARY截斷,有效地破壞你的價值。另外,您不會將索引放在加密值上,因此索引問題並不重要,也不會有默認值。

+0

根據我對[doc](https://dev.mysql.com/doc/refman/5.0/en/binary-varbinary.html)的理解,尾部空格不會從VARBINARY – fgrieu

3

我不認爲波希米亞的答案是準確的。 像BLOB這樣的VARBINARY將存儲二進制數據,因此它能夠存儲包括空格在內的任何任何數據。

mysql> create table t1 (id integer auto_increment, data varbinary(100), primary key (id)); 
Query OK, 0 rows affected (0.09 sec) 

// inserting '0', ' ', '0', ' ' - 4 characters including trailing space 
mysql> insert into t1 (data) values (unhex('30203020')); 
Query OK, 1 row affected (0.02 sec) 

+----+------+ 
| id | data | 
+----+------+ 
| 1 | 0 0 | 
+----+------+ 
1 row in set (0.00 sec) 

mysql> select t1.*, length(data) from t1; 
+----+------+--------------+ 
| id | data | length(data) | 
+----+------+--------------+ 
| 1 | 0 0 |   4 | 
+----+------+--------------+ 
1 row in set (0.00 sec) 
+0

中刪除[Bohemian的回答](http://stackoverflow.com/a/15982551/903600)中隱含的斷言是_trailing_空格從VARBINARY中刪除。這個斷言在[doc](https://dev.mysql.com/doc/refman/5.0/en/binary-varbinary.html)的基礎上似乎是錯誤的,但不會被所示的測試所反駁。 – fgrieu

+0

謝謝@fgrieu - 剛剛編輯我的示例。 – elousf

+0

@elsouf:所以你的(精煉)實驗和[文檔](https://dev.mysql.com/doc/refman/5.0/en/binary-varbinary.html)確認[波希米亞人的回答]中的建議( http://stackoverflow.com/a/15982551/903600)是基於***錯誤***的前提,在MySQL中,尾隨空格從VARBINARY中刪除。 – fgrieu

相關問題