Quantcast
Channel: CodeSection,代码区,网络安全 - CodeSec
Viewing all articles
Browse latest Browse all 12749

KDF:函数推导区块链密钥

0
0

来源:区块链研究实验室

目前,最重要的并不是数字数量的可能性。 现在是攻击者需要成功破解你的密钥时,现在就是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。

这里是一个例子:


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

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


Viewing all articles
Browse latest Browse all 12749