Argon2 如何用於密鑰派生?
根據我的理解,密鑰派生是當您獲取一些數據(例如密碼)並使用函式將其轉換為可以用作橢圓曲線密碼學中的密鑰的數字時。Argon2 在散列時使用隨機鹽,這需要儘管使用相同的密碼,但每次散列都不同。如果散列不同,如何用它來表示相同的密鑰?
根據我的理解,密鑰派生是當您獲取一些數據(例如密碼)並使用函式將其轉換為可以用作橢圓曲線密碼學中的密鑰的數字時。
是的,這是正確的,但是請記住,您的密碼應該有足夠的強度來防止暴力破解。一種常見的方法是使用dicewire或Bip39 之類的密碼機制,參見xkc936。
一旦你派生出密鑰 $ k $ ,那麼這是你的私鑰,並且 $ [k]G $ 是您在 ECC 中的公鑰和基點 $ G $ 的曲線。擦除 $ k $ 使用後千萬不要存入記憶體,請妥善保管您的密碼!
Argon2 在散列時使用隨機鹽,這需要儘管使用相同的密碼,但每次散列都不同。
是的,這也是正確的。您可以考慮使用 Argon2 的所有參數,執行確定性函式。相同的輸入將產生相同的輸出。這就是我們想要的散列函式、密碼散列函式和隨機預言機;確定性;相同的輸入必然導致相同的輸出。
使用不同的鹽用於從密碼中派生多個密鑰。同時,鹽是適用於彩虹表的一個很好的對策。
如果散列不同,如何用它來表示相同的密鑰?
要獲取相同的密鑰,需要使用相同的參數;相同的密碼、相同的鹽、相同的迭代、相同的記憶體使用和相同的並行化。除密碼外的參數不一定是秘密的,它們可以公開儲存。例如,這種資訊儲存在LUKS header中,重要的部分是始終對您的密碼保密。
當從密碼中導出密鑰時,必須儲存這些參數。
Argon2 如何用於密鑰派生?
首先,確定你的目標安全;即你想要多少攻擊者的生命是困難的。根據您的目標安全性調整迭代次數、並行化程度和記憶體使用情況。一旦你決定了,生成一個統一的隨機鹽。確定所需的密鑰大小,例如 256 位(或 32 字節)。現在您已準備好將 Argon2 與此資訊一起使用。
您向 Argon 提供您的資訊並決定您的目標安全性;
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
請注意,Argon2 有三種類型;
- Argon2d 速度更快,並且使用依賴數據的記憶體訪問。數據依賴性立即啟用旁道。這適用於不受側通道攻擊威脅的加密貨幣和應用程序。
- Argon2i 使用與數據無關的記憶體訪問,這是密碼散列和基於密碼的密鑰派生的首選。
- Argon2id 在第一次迭代的前半部分用作 Argon2i,其餘用作 Argon2d。這實現了邊通道保護和時間記憶體權衡。
如果您不知道它們之間的區別,或者您認為側通道攻擊是可行的威脅,請選擇 Argon2id。