Passwords

這會被視為安全密碼雜湊嗎?

  • February 3, 2022

我想我已經理解正確了,但我想確定一下,因為這會涉及到錢。

  1. 密碼要求至少為 16 個字元,並且必須包含每個字元之一$$ Upper, Lower, Digit, Other $$
  2. 我的鹽是 Crypto RNG 生成的 64 字節
  3. 我將鹽轉換為 Base64(沒有尾隨 ==)
  4. 然後我得到連接的UTF8字節(SaltString + Password)
  5. 然後我 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 的密碼不需要大寫、小寫、數字等限制。因此,在限制使用者遵守某些規則時要小心。

幾乎沒有密碼管理器

此外,幾乎每個人都有智能手機。可以使用密碼管理器來儲存密碼,這些密碼幾乎是由密碼管理器生成並儲存的隨機密碼。讓使用者也知道這一點。其中一些是免費的,例如LastPass1PasswordKeePass


回複評論:

我不能真正使用使用大量記憶體的算法(如果我正確理解記憶體硬度),因為它是一個伺服器。方法是否正確,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 因此保留熵

引用自:https://crypto.stackexchange.com/questions/98440