2017-03-27 81 views
4

尋找在MySQL中存儲BCrypt哈希的正確方法我發現this question,它只是讓我更加混淆。在MySQL上存儲BCrypt哈希的正確方法

接受的答案指出,我們應該使用:

CHAR(60) BINARY or BINARY(60)

但其他人的意見認爲,相反,我們應該使用:

CHAR(60) CHARACTER SET latin1 COLLATE latin1_bin

甚至:

COLLATE latin1_general_cs

我不是數據庫專家,所以任何人都可以解釋我所有這些選項之間的區別,哪一個是真正更好地存儲BCrypt哈希?

+0

據我所知,密碼散列是位流(即二進制),但通常表示爲純文本。你需要存儲什麼格式? –

+0

你的問題很危險地靠近*「難道有人請爲我閱讀關於MySQL數據類型的文檔並做出執行摘要嗎?「* – Tomalak

+0

@ÁlvaroGonzález是的,散列是一串比特,是的,它被編碼爲純文本,但所有這些存儲選項將導致數據庫上不同類型的行爲 – mFeinstein

回答

4

我的回答是「什麼是適當的」,而不是「什麼將工作」。

請勿使用latin1。當然,它可能會起作用,但它聲稱加密的字符串不是文本時是醜陋的。

同上說CHAR...

簡單地說如果固定長度是BINARY(...)或者如果長度可以變化則爲VARBINARY(...)

但是,有一個問題...誰使用BCrypt?它是否返回二進制數據?還是一個十六進制字符或者甚至可能是Base64?

我上面的答案假設它返回二進制數據。

如果它返回60個十六進制數字,則將UNHEX(60_hex_digits)存儲到BINARY(30)中,以便打包得更小。

如果它是Base64,那麼CHARACTER SET ascii COLLATE ascii_bin將是「適當的」。 (帶有區分大小寫的排序規則的latin1也可以工作。)

如果它是二進制的,那麼再次,BINARY(60)是'正確的方法。

您提供的鏈接看起來像Base64,但它是什麼?是高達 60個字符?然後,我會用

VARCHAR(60) CHARACTER SET ascii COLLATE ascii_bin 

而且明確規定的字符集/排序爲列,從而覆蓋數據庫和/或表「默認」。

所有Base64字符(和$)都是ascii;不需要更復雜的字符集。與..._bin整理意味着「完全比較字節」;更具體地說「不要做案例摺疊」。由於Base64取決於區分大寫和小寫字母,因此不需要摺疊大小寫。

+0

我不認爲我們可以考慮bcrypt作爲一個純base64字符串,因爲它將始終有它的前綴「$ 2a $」或「$ 2b $」或「$ 2y $」,它可以var y在協議的任何未來更新中,以及成本參數(類似$ 10 $)。目前,哈希長度爲60個字符,salt和哈希是base64,但前綴不是。 – mFeinstein

+0

@mFeinstein - 沒關係。我的建議仍然有效(在我修正了一個錯字之後!) –

+0

你能否詳細說明使用ascii_bin整理的優點嗎?我不是數據庫專家,所以我不知道提供的所有好處和保護。 – mFeinstein