使用密鑰派生函數(KDF)進行密碼拉伸
密鑰推導功能也稱為密碼擴展,是密碼應用程序(如區塊鏈,匿名p2p應用程序等)的主要部分,其目標是獲取密碼或密鑰,然後根據位元組數生成加密貨幣盟友強大和加密貨幣密鑰在配置中選擇。
密碼不是直接在加密貨幣系統中使用的最安全模式,KDF演算法通常用於使用輸入密碼中的較長密鑰創建更多隨機密鑰。
有不同的KDF演算法,例如Bcrypt不會為同一給定輸入返回相同的輸出。這意味著無法使用Bcrypt從給定密碼生成相同的密鑰。對於給定的輸入,其他人總是每次返回相同的結果,這反過來意味著可以從給定的密碼生成相同的密鑰。
KDF演算法基於加密貨幣散列函數,例如SHA-256,BLAKE-2B或AES加密貨幣中使用的分組密碼,它們使用SALT和胡椒的概念。
KDF演算法過程
KDF演算法幾乎可以在所有編程語言中實現,但在本文中,我將使用GoLang編程語言。
我們將使用GoLang中的pkdf包生成我們的密鑰,包的鏈接是https://godoc.org/golang.org/x/crypto/pbkdf2
下面是我們的KDF演算法實現的代碼庫。
Kdf實現代碼庫
代碼是基於它被很好地評測的事實自我解釋,但我將在實現中解釋更多關於一些事情。
在第3行-10中,我們導入了要在我們的應用程序中使用的必需包。
第17行以掩碼格式從終端獲取用戶的密碼位元組。
第25行在byte中創建一個salt,用於out程序。這可以是用戶選擇的任何隨機SALT。
第28行列印出用戶輸入的原始密碼。
第32-34行計算插入密碼的sha-256哈希並在終端上列印出來。
第43行根據輸入參數獲取派生密鑰。
func Key(密碼,salt()位元組,iter,keyLen int,h func()hash.Hash)()byte
包提供的Key函數允許我們自定義輸出鍵的強化級別。以下是我們提供的更改參數。
密碼:這是要拉伸的輸入密碼,類型必須是位元組。
Salt:Salt是添加到輸入密碼的額外層,以使其更加強化。類型必須是位元組
iter:迭代次數是在計算派生密鑰的散列時迭代的次數。類型必須是Int
KeyLen:這是要返回的建議密鑰的長度。類型必須是Int。
h:這是生成密鑰時使用的哈希函數
然後返回包含派生密碼的輸出。
第46行列印出派生密鑰,這將是一個非常長的密鑰,所以我們需要將它傳遞到一個SHA-256哈希函數,它在第49行完成。
最後,我們列印出派生密鑰的散列值。
通過執行go run main.go運行應用程序會產生以下輸出。
1.)原始密碼: – > mySecurePassword 2.)哈希密碼: – > b6573a02de91d76cc442a6f42aa749c6eee0982c148bb7e9116ee44f93e6807a 3.)KDF密鑰: – > cdf347254e0fb199015a2721110c0a1b1bfc4f66f718a712930173f93290ed783e08e5655c57fd608da39269a10708
fbe191b1141c6ea9d97d02f6bfbbd90580a3aed101a627e8e96d5cb5c51e24dbe1d5e2dca531c9f658de77080352a0394bb48af8636b840
358314bfea2c0eb6a411ea36212bd13bd552a29be78e59fab17 4.)散列衍生密鑰: – > e6e562be28fc935a2ea2e57f21b018237098aeab64c2621d11627be4e9dfe601
您可能會認為第二個和第四個答案即使長度也產生相同的長度。你是對的,原因是Hash函數總是返回一個修復長度大小,而不管輸入的大小。
你可能想問的另一個問題是,為什麼我們只能使用哈希函數進行鍵拉伸,如果它們產生某種隨機性和鍵拉伸。對此的答案是,強制執行哈希函數的結果更容易,而強制KDF演算法的暴力計算是昂貴的。
您可以從下面的鏈接下載代碼庫,並根據您的需要進行擴展。
謝謝你的閱讀
支持並表現出一些愛(Claps)
princesegzy01 / KDF-實施
GoLang中密碼擴展的密鑰導出函數(KDF)演算法的實現… github.com