3 回答

TA貢獻1796條經驗 獲得超7個贊
bcrypt的模塊加密格式由以下內容組成
或$2$
,?$2a$
標識$2y$
散列算法與格式
- 表示成本參數的兩位數值,后面跟著
$
- 53個字符長-64編碼值(他們使用字母表)
與.
,?/
,?0
–9
,?A
–Z
,?a
–z
標準堿基64編碼
(字母表)包括:- 22個字符(實際上只有132位解碼比特中的128位)
- 加密輸出的31個字符(實際上186位解碼比特中只有184位)
因此,總長度分別為59或60字節。
當您使用2a格式時,您將需要60個字節。因此,對于MySQL,我建議使用CHAR(60) BINARY
或BINARY(60)
(見這個垃圾箱和雙星??庇嘘P差異的信息)。
CHAR
不是二進制安全的,等式不是完全依賴于字節值,而是依賴于實際的排序規則;在最壞的情況下。

TA貢獻1806條經驗 獲得超8個贊
如果您正在使用PHP的password_hash()
帶著PASSWORD_DEFAULT
生成bcrypt哈希的算法(我假設有很大比例的人閱讀這個問題)一定要記住,在將來password_hash()
可能會使用不同的算法作為默認值,因此可能會影響哈希的長度(但不一定更長)。
從手冊頁:
請注意,隨著PHP添加了新的和更強的算法,這個常量被設計成隨著時間的推移而改變。因此,使用此標識符的結果的長度會隨著時間的推移而改變。因此,建議將結果存儲在可擴展超過60個字符的數據庫列中。(255個字符將是一個不錯的選擇)。
使用bcrypt,即使您有10億用戶(即您目前正在與Facebook競爭)存儲255字節密碼散列,它也只能存儲255 GB的數據-相當于一個小型SSD硬盤的大小。存儲密碼散列不太可能成為應用程序的瓶頸。然而,在偶然的機會中,存儲空間真的是由于某種原因,您可以使用PASSWORD_BCRYPT
強迫password_hash()
使用bcrypt,即使這不是默認的。只需確保隨時了解在bcrypt中發現的任何漏洞,并在每次發布新PHP版本時檢查發布說明。如果默認的算法被改變了,那么最好檢查一下。為什么并做出是否使用新算法的明智決定。
添加回答
舉報