是的,您可以將其存儲在單個字段中,並且許多數據庫/應用程序將salt + hash存儲在單個字段/文件中。
最著名的是Linux(不是Linux DB),使用以下格式將哈希存儲在/ etc / shadow文件中:
“ $ id $ salt $ hashed”,這是由crypt(C)產生的密碼哈希的可打印形式,其中“ $ id”是使用的算法。 (在GNU / Linux上,“ $ 1 $”代表MD5,“ $ 2a $”代表Blowfish,“ $ 2y $”代表Blowfish(8位字符的正確處理),“ $ 5 $”代表SHA-256,“ $ 6 $ “是SHA-512,[4]其他Unix可能具有不同的值,例如NetBSD。
(來源: https://en.wikipedia.org/wiki/Passwd)
鹽並不意味著是秘密的(或至少不比散列更秘密),其主要目的是使暴力破解更加困難,因為攻擊者必須使用
但是您的問題更加細微-因為您不僅在詢問鹽,而且還詢問參數,例如哈希算法,迭代計數和鹽。
假設您有很多用戶,並且您使用SHA1作為哈希算法,那麼您的數據庫字段將是類似 SHA1:SALT:HASH 的東西。
如果您想將數據庫升級到BCRYPT,您將如何做?
Typi毫無疑問,您將部署一些代碼,以便在用戶登錄時驗證密碼,如果有效,則可以使用較新的算法重新哈希密碼。現在,該用戶的字段如下所示: BCRYPT:SALT:HASH 。
但是隨後某些用戶將位於SHA1上,而其他用戶將位於BCRYPT上,因為該用戶位於用戶級別,您需要使用參數來告訴您的代碼哪些用戶將屬於數據庫中的用戶。
簡而言之,將參數和哈希存儲在單個字段中是可以的,但是出於任何原因將它們拆分出來(效率,更簡單的代碼等)也可以。不能的是將其存儲在您的代碼中:)
TL:DR
特洛伊·亨特(Troy Hunt)最近發布了一個播客,建議與採用上述方式遷移到BCRYPT相比,簡單地獲取當前正在使用的所有SHA1哈希更為有效。
有效地 BCRYPT(SHA1(clear_password))
當用戶登錄時,
BCRYPT(SHA1(clear_password))== <db_field>
通過這種方式,平台上的每個人都可以一次升級,而您的數據庫沒有多個哈希密碼格式。非常乾淨而且非常好。
我認為這個想法很合理,但是即使每個人都一次遷移,它也不是瞬時的。除非您願意接受應用程序的某些停機時間(在重新哈希所有密碼的同時),否則仍有一些時間間隔,有些用戶使用BCRYPT,有些用戶使用SHA1,因此您的數據庫仍應存儲哈希算法的參數,您的代碼將基於該算法執行。