Hash

Argon2輸出長度和參數儲存?

  • August 9, 2016

我今天剛開始使用.net 的 libsodium 埠,輸出長度參數讓我感到困惑(我正在使用 argon2i 實現)。

由於我對散列的了解有限,我使用的任何散列算法總是返回一個恆定的位長度(例如 MD5 和 128)。預設情況下它返回 128 就像 MD5 一樣讓我吃驚。我總是將長度等同於力量(儘管我意識到在每種情況下都沒有一對一的相關性)。

然後是可變長度輸出的問題,我應該選擇什麼:)。使用 argon2 增加位長度真的會更安全嗎?我隨意選擇了512位,但我不知道這是否好。

第二個,但有點不相關的問題,您認為您是否應該將參數(可以更改雜湊)與密碼和鹽一起儲存在數據庫中。例如 opsLimit、memLimit、outputLenght 等…

您需要考慮最薄弱環節的屬性:安全系統永遠不會比其最薄弱環節更強。由於 Argon2 是基於密碼的函式,因此這裡的薄弱環節將是使用者密碼的強度。如果密碼的熵低於此值,則選擇更長的輸出長度無濟於事。

可以這樣想:如果雜湊函式是安全的,那麼攻擊者有兩種方法來攻擊密碼:

  1. 使用愚蠢的蠻力嘗試找到一個使用者密碼的原像。
  2. 使用有關使用者習慣的知識來猜測更可能的密碼,而不是不太可能的密碼。

更長的輸出可能會使#1 變得更難,但是一旦你使#1 變得足夠困難,那麼#2 就變成了簡單的路徑,攻擊者就會嘗試這樣做。所以 Argon2 的作者推薦 128 位雜湊聽起來不錯,因為 128 位輸出成為限制因素的唯一情況是,如果您的使用者的密碼是瘋狂的熵,例如:

  • 長度為 20 或更長(6.6 位/字元)的 ASCII 可列印統一隨機密碼;
  • 長度為 40 位或以上的 PIN,隨機統一選擇(3.3 位/位);
  • 11 字或更長的Diceware密碼(12.9 位/字);
  • 12字或更長的XKCD“正確的電池馬釘”密碼(2,048字詞典,隨機統一選擇的單詞)。

如果可以指望您的使用者選擇那麼強的密碼,那麼您一開始就不需要專門的密碼雜湊函式!

第二個,但有點不相關的問題,您認為您是否應該將參數(可以更改雜湊)與密碼和鹽一起儲存在數據庫中。例如 opsLimit、memLimit、outputLenght 等…

是的,您應該儲存它們。請注意,例如 Argon2 命令行實用程序(可從Argon2 repo獲得)生成集成它的驗證標籤(此範例中的“編碼”欄位來自連結):

$ echo -n "password" | ./argon2 somesalt -t 2 -m 16 -p 4 -l 24
Type:           Argon2i
Iterations:     2
Memory:         65536 KiB
Parallelism:    4
Hash:           45d7ac72e76f242b20b77b9bf9bf9d5915894e669a24e6c6
Encoded:        $argon2i$v=19$m=65536,t=2,p=4$c29tZXNhbHQ$RdescudvJCsgt3ub+b+dWRWJTmaaJObG
0.188 seconds
Verification ok

再想一想,我想我明白為什麼如果我處於你的位置我會感到困惑。如果預設的 128 位長度沒問題,並且延長它並不能真正提供更高的安全性,為什麼該函式允許我選擇更長的輸出長度?

嗯,原因是 Argon2 有兩個不同的用途:

  • 密碼驗證
  • 密鑰派生

正如我上面解釋的,長輸出在密碼驗證中沒有用,但在密鑰派生情況下很有用。一個範例情況,您想要類似的東西是基於密碼的加密,您正在執行諸如使用 AES-256 加密文件之類的操作,但是,您不是讓使用者管理原始 AES 密鑰,而是嘗試變得更友好並讓他們使用密碼反而。例如,這就是GnuPG 的對稱加密模式的工作原理(儘管它不使用 Argon2)。

在這種情況下,由於您的密碼需要 256 位密鑰,因此您需要能夠從使用者密碼生成 256 位密鑰。因此,可選擇的輸出長度可以讓您滿足要求。

請注意,最弱連結屬性仍然適用於此,因此在這種情況下,即使您使用 256 位加密,密碼仍然是最弱連結。較長的輸出長度允許您做的是匹配 256 位密碼強加的技術要求,並為您的使用者提供選擇有效達到該安全級別的密碼片語的選項- 很少有人會這樣做(例如, 40 個字元的隨機 ASCII 密碼!)。

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