KDF:函数推导区块链密钥

区块链研究实验室
媒体专栏
热度: 136828

目前,最重要的并不是数字数量的可能性。 现在是攻击者需要成功破解你的密钥时,现在就是KDF真正进入技术的地方。

来源:区块链研究实验室

目前,最重要的并不是数字数量的可能性。 现在是攻击者需要成功破解你的密钥时,现在就是KDF(Key Derivation Function)真正进入技术的地方。

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。

这里是一个例子:

「区块链研究实验室」区块链密钥推导函数Key Derivation Function

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钱包并代表您的用户生成密钥,并且一名用户被黑客入侵,他们将立即开始怀疑您。


文章声明:本文为MarsBit专栏作者作品,版权归作者所有,不代表MarsBit观点。

声明:本文为入驻“火星财经 专栏”作者作品,不代表火星财经官方立场。
转载请联系网页底部:内容合作栏目,邮件进行授权。授权后转载时请注明出处、作者和本文链接。未经许可擅自转载本站文章,将追究相关法律责任,侵权必究。
提示:投资有风险,入市须谨慎,本资讯不作为投资理财建议。
本内容旨在传递行业动态,不构成投资建议或承诺。
关键字:KDF