KDF:函数推导区块链密钥
发布:中币网 时间:2018-07-15 18:15:00 加入收藏 打赏
目前,最重要的并不是数字数量的可能性。 现在是攻击者需要成功破解你的密钥时,现在就是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。
这里是一个例子:
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钱包并代表您的用户生成密钥,并且一名用户被黑客入侵,他们将立即开始怀疑您。
原文出自:http://www.huoxing24.com/newsdetail/2018071211193592108.html
微信公众号→添加朋友→搜bitett
来源:比特头条
来源:中币网 https://www.zhongbi.net/news/blocknews/95638.html 声明:登载此文仅出于分享区块链知识,并不意味着赞同其观点或证实其描述。文章内容仅供参考,不构成投资建议。投资者据此操作,风险自担。 此文如侵犯到您的合法权益,请联系我们3111859717@qq.com,我们将第一时间处理。