2015-11-13 210 views
3

我有一段信息是使用aes-256-cbc加密編碼的。我應該如何將它存儲在數據庫中?目前我正在使用VARCHAR(255)utf8_bin。這是好的,還是應該使用其他字段類型,如VARBINARY(255)?在這種情況下是否有可能使用VARCHAR丟失一些數據?謝謝。如何在AES數據庫中存儲AES加密密碼

+4

你不應該加密你的用戶密碼。你需要使用散列,而不是一些強大的PBKDF2,bcrypt和scrypt。由於散列函數是單向函數,因此您將無法「解密」散列。爲了驗證您的用戶,您可以再次通過散列函數運行密碼,以便與存儲在數據庫中的散列進行比較。查看更多:[如何安全地哈希密碼?](http://security.stackexchange.com/q/211/45523) –

+2

這是不可能強調這一點:**不要存儲密碼**。 – xxbbcc

+0

我從來沒有說過我正在加密用戶的帳戶密碼。這只是一些敏感數據,不需要以純文本格式存儲。很高興爲我們的用戶提供功能。 –

回答

5

的存儲加密的(相對於散列)儘管在一個數據庫密碼可能的(上)是否適當,AES密文是二進制數據,因此should be stored as such,即在一個BINARY/VARBINARY柱或BLOB

也可以對密文進行編碼,例如,作爲base64,然後將其存儲在文本(即CHAR/VARCHAR/TEXT)列中。這不太節省空間,但它可能有時更方便,例如,當直觀地檢查數據或在可能無法處理包含任意二進制數據的字段的程序之間傳遞數據時。

+0

我想了解將這些數據存儲爲UTF8文本的後果是什麼。 varchar - >文本字符串; varbinary - >二進制字符串。爲什麼我不應該把它保留爲UTF8文本,如果它是一個字符串呢。 –

+2

AES密文可以包含無效的UTF-8字節序列,所以我不會試圖將其視爲這樣。我沒有測試過是否會發生任何數據損壞*,但不能保證它*不會*。考慮到有一個更合適的工具('VARBINARY')可用,使用''latin1'' *這樣的單字節字符集'VARCHAR'可能會更安全,但我不會使用它。 –