2010-02-10 258 views
169

我打算在密碼+ salt上運行SHA256,但是我不知道在設置MySQL數據庫時多長時間使我的VARCHAR。什麼是好長度?SHA256散列需要多長時間?

+3

在任何人閱讀本文之前,請務必遵循此建議並使用SHA- *'哈希密碼,[請先閱讀本文](https://security.stackexchan ge.com/questions/16354/whats-the-advantage-of-using-pbkdf2-vs-sha256-to-generate-an-aes-encryption-key)。 – c00000fd 2017-05-10 05:31:33

+0

具有示例的詳細博客:http://sforsuresh.in/mysql_varchar_max_length/ – 2017-09-28 11:22:38

回答

241

sha256的長度是256位 - 正如其名稱所示。

如果您使用的是十六進制表示法,則每個數字代碼爲4位;所以你需要64位數字來表示256位 - 所以,你需要一個varchar(64)char(64),因爲長度總是相同的,根本不變。

而且演示:

$hash = hash('sha256', 'hello, world!'); 
var_dump($hash); 

會給你:

$ php temp.php 
string(64) "68e656b251e67e8358bef8483ab0d51c6619f3e7a1a9f0e75838d41ff368f728" 

即具有64個字符的字符串。

+6

我們可以使用char(64)作爲主鍵還是使用二進制(32)更好? (access_token) – frankish 2013-09-15 10:18:15

+3

如果您認爲將來可能想阻止用戶,那麼我建議使用'varchar(65)'作爲領先的'!'......只是說。 – Manatax 2014-03-09 21:42:01

+54

...或者只是添加一個'阻止'的列? – 2014-10-10 19:57:54

19

爲什麼要讓它變成VARCHAR?它沒有變化。它始終是64個字符,可以通過將任何內容運行到one of the online SHA-256 calculators來確定。

+0

是char(64)有效的mysql語句嗎? – sepiroth 2010-02-10 23:07:23

+21

@hatorade:不,它不是一個聲明,但它是一個有效的列類型。 – 2010-02-10 23:09:39

+9

varchar也不會分配空間,除非它被使用,與char不同,它會分配允許的總字符數量,不管是否有數據填充。 – Xenland 2013-02-11 16:44:14

6

這將是固定的64個字符,所以使用char(64)

18

我更喜歡使用BINARY(32),因爲它是最優化的方式!

您可以從(00到FF)中放置32位十六進制數字。

因此BINARY(32)!

+6

+1 - 我喜歡優化...給其他人在這發生......用於MySQL ...你可以使用'UPDATE ... SET hash_column = UNHEX(sha256HexString)'。然後,當檢索它時,你選擇HEX(hash_column)AS hash_column'。 – 2014-09-17 21:20:03

32

爲SHA256的256個比特編碼選項:

  1. Base64的:每焦炭= CHAR(44) 6位包括填充字符
  2. 十六進制:每焦炭= CHAR(64)
  3. 二進制4個比特:8個每字節位= BINARY(32)
+13

Base64是每4個字符3個字節,所以即使32個字節適合43個字符,實際上也需要44個。額外=被添加爲最終字符 – Wilco 2015-06-02 21:23:59