KDF:函數推導區塊鏈密鑰區塊鏈
目前,最重要的并不是數字數量的可能性。現在是攻擊者需要成功破解你的密鑰時,現在就是KDF(KeyDerivationFunction)真正進入技術的地方。
KDF或密鑰推導函數是一種強大的密鑰,即使你的熵很低。
想象一下,你想生成一顆種子,攻擊者知道有10,000,000種可能性。這種類型的種子通常很容易被攻破。
但是如果你可以讓枚舉變慢呢的方法呢?
KDF是一種散列函數,有意浪費計算資源。
這里是一個例子:
var derived = SCrypt.BitcoinComputeDerivedKey("hello", new byte[] { 1, 2, 3 });
RandomUtils.AddEntropy(derived);
即使你的攻擊者知道你的熵源是5個字母,他也需要運行Scrypt來檢查每個可能性,這可能也需要5秒鐘去破解。
不信任PRNG沒有任何偏執,并且可以通過添加熵和使用KDF來緩解攻擊。
請記住,攻擊者可以通過收集有關您或您的系統的信息來減少熵。如果您使用時間戳作為熵源,那么攻擊者可以通過知道您上周生成密鑰來降低熵,并且您只在上午9點至下午6點之間使用計算機。
在上一部分中,簡要地談了一個叫做Scrypt的特殊KDF。 正如所說,KDF的目標是使暴力成本高昂。因此,對于您而言,已經存在一個使用KDF用密碼加密私鑰的標準并不令人感到意外。 這就是BIP38。
這里是一個例子:
var privateKey = new Key();
var bitcoinPrivateKey = privateKey.GetWif(Network.Main);
Console.WriteLine(bitcoinPrivateKey);
// L1tZPQt7HHj5V49YtYAMSbAmwN9zRjajgXQt9gGtXhNZbcwbZk2rBitcoinEncryptedSecret encrypted
BitcoinPrivateKey = bitcoinPrivateKey.Encrypt("password");
Console.WriteLine(encryptedBitcoinPrivateKey);
// 6PYKYQQgx947Be41aHGypBhK6TA5Xhi9TdPBkatV3fHbbKrdDoBoXFCyLKvar decrypted
BitcoinPrivateKey = encryptedBitcoinPrivateKey.GetSecret("password");
Console.WriteLine(decryptedBitcoinPrivateKey);
// L1tZPQt7HHj5V49YtYAMSbAmwN9zRjajgXQt9gGtXhNZbcwbZk2r
Console.ReadLine();
這種加密用于兩種不同的情況:
你不相信你的存儲提供商(他們可能會被黑客攻擊)
您代表其他人存儲密鑰(并且您不想知道密鑰)
如果你擁有你的存儲,那么在數據庫級別進行加密可能就足夠了。
如果您的服務器負責解密密鑰,請小心,攻擊者可能會嘗試通過強制解密許多密鑰來對服務器執行DDOS操作。盡可能將解密委托給最終用戶。
首先,為什么要生成幾個密鑰?
主要原因是隱私。 由于您可以看到所有地址的余額,所以最好為每筆交易使用一個新地址。
但是,實際上,您也可以為每個聯系人生成密鑰,這使得您可以輕松識別付款人而不會泄露太多隱私。
您可以生成一個密鑰,就像您在開始時所做的那樣:
var privateKey = new Key()
但是,你有兩個問題:
當您生成新密鑰時,您擁有的所有錢包備份將變得過時。
您不能將地址創建過程委派給不受信任的對等方。
如果您正在開發Web錢包并代表您的用戶生成密鑰,并且一名用戶被黑客入侵,他們將立即開始懷疑您。
1.TMT觀察網遵循行業規范,任何轉載的稿件都會明確標注作者和來源;
2.TMT觀察網的原創文章,請轉載時務必注明文章作者和"來源:TMT觀察網",不尊重原創的行為TMT觀察網或將追究責任;
3.作者投稿可能會經TMT觀察網編輯修改或補充。