首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

区块链的密钥推导函数Key Derivation Function

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

KDF或密钥推导函数是一种强大的密钥,即使你的熵很低。

想象一下,你想生成一颗种子,攻击者知道有10,000,000种可能性。这种类型的种子通常很容易被攻破。

但是如果你可以让枚举变慢呢的方法呢?

KDF是一种散列函数,有意浪费计算资源。

这里是一个例子:

varderived = SCrypt.BitcoinComputeDerivedKey("hello",newbyte[] {1,2,3});

RandomUtils.AddEntropy(derived);

即使你的攻击者知道你的熵源是5个字母,他也需要运行Scrypt来检查每个可能性,这可能也需要5秒钟去破解。

不信任PRNG没有任何偏执,并且可以通过添加熵和使用KDF来缓解攻击。

请记住,攻击者可以通过收集有关您或您的系统的信息来减少熵。如果您使用时间戳作为熵源,那么攻击者可以通过知道您上周生成密钥来降低熵,并且您只在上午9点至下午6点之间使用计算机。

在上一部分中,简要地谈了一个叫做Scrypt的特殊KDF。 正如所说,KDF的目标是使暴力成本高昂。因此,对于您而言,已经存在一个使用KDF用密码加密私钥的标准并不令人感到意外。 这就是BIP38。

这里是一个例子:

varprivateKey =newKey();

varbitcoinPrivateKey = privateKey.GetWif(Network.Main);

Console.WriteLine(bitcoinPrivateKey);// L1tZPQt7HHj5V49YtYAMSbAmwN9zRjajgXQt9gGtXhNZbcwbZk2rBitcoinEncryptedSecret encrypted

BitcoinPrivateKey = bitcoinPrivateKey.Encrypt("password");

Console.WriteLine(encryptedBitcoinPrivateKey);// 6PYKYQQgx947Be41aHGypBhK6TA5Xhi9TdPBkatV3fHbbKrdDoBoXFCyLKvardecrypted

BitcoinPrivateKey = encryptedBitcoinPrivateKey.GetSecret("password");

Console.WriteLine(decryptedBitcoinPrivateKey);// L1tZPQt7HHj5V49YtYAMSbAmwN9zRjajgXQt9gGtXhNZbcwbZk2r

Console.ReadLine();

这种加密用于两种不同的情况:

你不相信你的存储提供商(他们可能会被黑客攻击)

您代表其他人存储密钥(并且您不想知道密钥)

如果你拥有你的存储,那么在数据库级别进行加密可能就足够了。

如果您的服务器负责解密密钥,请小心,攻击者可能会尝试通过强制解密许多密钥来对服务器执行DDOS操作。尽可能将解密委托给最终用户。

首先,为什么要生成几个密钥?

主要原因是隐私。 由于您可以看到所有地址的余额,所以最好为每笔交易使用一个新地址。

但是,实际上,您也可以为每个联系人生成密钥,这使得您可以轻松识别付款人而不会泄露太多隐私。

您可以生成一个密钥,就像您在开始时所做的那样:

var privateKey = new Key()

但是,你有两个问题:

当您生成新密钥时,您拥有的所有钱包备份将变得过时。

您不能将地址创建过程委派给不受信任的对等方。

如果您正在开发Web钱包并代表您的用户生成密钥,并且一名用户被黑客入侵,他们将立即开始怀疑您。

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20180527A07XT900?refer=cp_1026
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券