這會被視為安全密碼雜湊嗎?
我想我已經理解正確了,但我想確定一下,因為這會涉及到錢。
- 密碼要求至少為 16 個字元,並且必須包含每個字元之一$$ Upper, Lower, Digit, Other $$
- 我的鹽是 Crypto RNG 生成的 64 字節
- 我將鹽轉換為 Base64(沒有尾隨 ==)
- 然後我得到連接的UTF8字節(SaltString + Password)
- 然後我 SHA512 循環中的那些字節 100k 次
private static byte[] SaltPassphrase(byte[] salt, string password) { var sha512 = SHA512.Create(); // Salt as Base64 string (without the == at the end) followed by password string input = $"{Convert.ToBase64String(salt)[0..^2]}{password}"; byte[] bytes = sha512.ComputeHash(Encoding.UTF8.GetBytes(input)); for (int i = 0; i < 100_000; i++) bytes = sha512.ComputeHash(bytes); return bytes; }
編輯 感謝大家的詳細解釋和有用的評論!
除了迭代量(我們可以說它也很小‡和一些熵損失*),答案是否定的!
- 沒有主要防止大規模 ASIC/GPU 搜尋的記憶體硬度
- 沒有多個執行緒主要削弱大量 CPU 搜尋。
除了像 SHAx 系列這樣的加密散列之外,已經有密碼散列算法。一些重要的是Scrypt (2009)、PBKDF2 (2000)、Argon2 (2015)和Balloon Hashing (2016)。Argon2 是2015 年舉辦的密碼雜湊競賽的獲勝者。現在,Balloon Hashing 可以與 Argon2 並肩作戰。使用 Balloon Hashing 或 Argon2 進行安全密碼散列。
已經有每個庫,您只需要像Argon2一樣進行參數化,而不是自己編寫詳細資訊。
一個好的 Argon2 庫
這是參數;
Usage: ./argon2 [-h] salt [-i|-d|-id] [-t iterations] [-m memory] [-p parallelism] [-l hash length] [-e|-r] [-v (10|13)] Password is read from stdin Parameters: salt The salt to use, at least 8 characters -i Use Argon2i (this is the default) -d Use Argon2d instead of Argon2i -id Use Argon2id instead of Argon2i -t N Sets the number of iterations to N (default = 3) -m N Sets the memory usage of 2^N KiB (default 12) -p N Sets parallelism to N threads (default 1) -l N Sets hash output length to N bytes (default 32) -e Output only encoded hash -r Output only the raw bytes of the hash -v (10|13) Argon2 version (defaults to the most recent version, currently 13) -h Print argon2 usage
我可能會問什麼是 $ i,d, $ 和 $ id $ 在氬氣2。答案來自draft-irtf-cfrg-argon2-03;
如果您不知道它們之間的區別,或者您認為側通道攻擊是可行的威脅,請選擇 Argon2id。
- Argon2d速度更快,並且使用依賴數據的記憶體訪問。數據依賴性立即啟用旁道。這適用於不受側通道攻擊威脅的加密貨幣和應用程序。
- Argon2i使用與數據無關的記憶體訪問,這是密碼散列和基於密碼的密鑰派生的首選。
- Argon2id在第一次迭代的前半部分作為 Argon2i 工作,其餘作為 Argon2d 工作。這實現了邊通道保護和時間記憶體權衡。
氣球散列
現在,它在NIST 特別出版物 800-63B中,需要一些時間來適應。有一些庫可供使用。
主要屬性是;
- 記憶硬度已被證明
- 它是根據標準原語設計的:它可以使用任何非記憶體硬加密散列函式,如 SHA2、SHA3 和 BLAKE2。
- 它具有對側通道攻擊的內置抵抗力,該攻擊要求記憶體訪問模式獨立於要散列的數據位。
關於密碼的一點點
對於使用者的密碼,您應該教育他們使用基於dicewire的密碼生成。如果他們不使用它們,那麼限制它們可能會有所幫助。請注意,基於 dicewire 的密碼不需要大寫、小寫、數字等限制。因此,在限制使用者遵守某些規則時要小心。
幾乎沒有密碼管理器
此外,幾乎每個人都有智能手機。可以使用密碼管理器來儲存密碼,這些密碼幾乎是由密碼管理器生成並儲存的隨機密碼。讓使用者也知道這一點。其中一些是免費的,例如LastPass、1Password和KeePass。
回複評論:
我不能真正使用使用大量記憶體的算法(如果我正確理解記憶體硬度),因為它是一個伺服器。方法是否正確,SHA512 是否合適,考慮到密碼長度,迭代是否合適?
SHA-512 對密碼的記憶體使用很少,只需要儲存 1024 位即可生成密碼雜湊。Argon2 的預設記憶體參數是 $ 2^{12} $ KiB = 4MiB。如果我們認為一個系統可以執行任意數量的執行緒,那麼暴力破解基於 SHA-512 的算法的能力將減少 32768 倍。因此,即使是一點點記憶體使用也會通過以下方式增強密碼散列的複雜性 $ 2^{15} $ . 4MiB 對於伺服器來說完全沒問題,可以根據每秒登錄訪問量調整記憶體,或者更好地購買更多記憶體。請記住,密碼散列算法將記憶體留給系統。要考慮的瓶頸是每秒的登錄請求數。
‡) OpenSSL 速度結果顯示 SHA-512 100K 很小。
Doing sha512 for 3s on 64 size blocks: 10896142 sha512's in 3.00s Doing sha512 for 3s on 256 size blocks: 4673961 sha512's in 2.99s
*)每次加密雜湊函式迭代我們損失多少熵
Squeamish Ossifrage 對此 寫了一個很好的答案。. 結果的核心是
相反,對於任何固定函式 F,很有可能存在許多循環,其中 F 是一個排列,並且限制為 F 因此保留熵