千里之堤毁于蚁穴(慎用HD Wallets)
转自:http://blog.sina.com.cn/s/blog_12ce70a430102vbu9.html
千里之堤毁于蚁穴(慎用HD Wallets)
-- 随机系列谈之四
现在我们都该明白,无论怎样强调随机对于比特币的重要性都不为过,随机的确称得上是比特币的“命根子”。
在过去的几篇文章中,小太已经介绍过了一些因随机问题可能导致私钥暴漏的情况,今天,我再跟大家聊聊分层确定性(Hierarchical Deterministic)钱包。
HD Wallets因其“只需要一个主(根)私钥,就能生成海量子私钥”这个特性广受欢迎,在过去的一年里,越来越多的钱包解决方案和比特币企业开始支持或采用HD模型来进行私钥管理,可是,大部分人并未意识到其中可能存在的潜在风险。(本文不讨论HD的原理,有兴趣的童鞋可参阅《分分钟搞懂HD钱包》 http://blog.sina.com.cn/s/blog_12ce70a430102v8c7.html 及 BIP32 规范中的相关说明)
HD模型的最大优点是不使用私钥就能生成大量的由您掌握的地址,其原理就在于直接通过主公钥就可以生成任意数量的子公钥,整个过程无需访问主私钥。这个特性有如下好处:
1、备份容易,只需备份主私钥,新增地址无需再次备份私钥;
2、保证主私钥的冷存储,无论新增多少个地址,仅需主公钥就能完成,无需主私钥介入;
3、方便的第三方审计,只需给第三方机构或会计提供主公钥,他就可以看到所有下级地址的交易,但又不能花费任何币(因为没有子私钥);
因为HD模型的这些好处,钱包解决方案和比特币企业就可以很方便的进行私钥管理。比如说,电子商务网站或交易所就可以在网站服务器上存放主公钥,然后按需新增子地址,对每个用户、每个商品甚至每笔交易都使用一个全新的比特币地址,而整个过程不会涉及冷存储的主私钥;再比如说,个人可以冷存储主私钥,在热设备上存放主公钥,就能方便的生成任意数量的地址,满足自己不断新增地址而又无需备份私钥的需求。
但这些好处其实是有代价的,因为HD模型有一个天生的“缺陷”(无论是Type1、Type2、还是遵循BIP32规范的确定性钱包),那就是只要暴漏任何一个子私钥,再加上主公钥,就能反推出主私钥,这是“致命”的。
也就是说,对于企业或个人,如果您使用HD模型管理私钥,出于方便的增加地址及第三方审计等目的,主公钥往往暴漏在外(主公钥的安全级别当然要远低于主私钥)。大家可能会认为,我们只要能安全的保管好私钥就足够了(比如说绝对冷存储主私钥,离线的使用子私钥签名交易等),但通过前几篇文章,您就该明白,如果使用了不够安全的随机数,签名交易也有可能会暴漏私钥。对于非HD解决方案来说,一个有问题的签名最多只会暴漏一个私钥,而在HD模型的情况下,任何一个子私钥的暴漏,都有可能导致主私钥的暴漏,最严重的情况下,整个树状的分层模型会整个崩塌,企业或个人的比特币资产也会全部丢失,这就是HD模型的最大风险。
HD模型的“安全”与“易用”其实是个悖论,为了易用,我们希望无论新增多少个地址都无需备份私钥,这就需要热的(泄露概率高)主公钥,而为了安全,又必须保护好主公钥,否则任何一个子私钥的泄露,都能反推出主私钥。这显然是个矛盾,而如果发生潜在的随机数问题,又会放大这种矛盾。因此,在这里,我特别提醒大家谨慎使用HD模型。
比特币的安全就在于随机,我们希望随机的生成一个个比特币私钥用来存币,希望使用随机的k值来签名交易。而HD Wallets的模型其实是基于一个唯一的(根)随机数来确定性的构建了整个分层级的、树状的私钥大厦(私钥和私钥间有着确定性的计算关系)。这座大厦,在没有遇到任何问题的时候,看起来也许是固若金汤,但任何一个小问题(如r值问题、内鬼盗窃等)的发生,都有可能导致整个大厦的崩塌。
这也许就是传说中的“千里之堤毁于蚁穴”吧!
最后,再说一句,尽量使用不相关(随机)的私钥解决方案吧,这才是比特币之本,比特币企业和个人应谨慎使用HD Wallets。
小太关于随机这个系列的文章就暂告一段落了,必须再次提醒大家,随着安全专家和黑客对k值更为深入的分析,因不安全随机数导致的丢币未来可能会越来越多,如果企业和个人采用了HD方案,甚至有可能会放大这种灾难,随机理应引起业内人士的足够重视。
看完这几篇文章,有人可能会担心“比特币到底安不安全?”。在这里,小太可以很负责的告诉您,直到今天(及可预计的未来),比特币很安全,比特币所依赖的椭圆曲线签名算法(ECDSA)也很安全,不安全的是一些有问题随机数生成器或技术解决方案,这些都与比特币无关。
本系列文章要特别感谢 Nicolas, Pinar, Filippo 这三位大牛,他们最近发表的论文(https://eprint.iacr.org/2014/848.pdf)让小太收益良多。在该论文中,几位作者深入的解释了不安全随机数的风险及其对HD Wallets可能造成的灾难,该篇论文干货十足,值得每位从业者学习。
----------------------------------------------------------------------------------------------
分分钟搞懂 HD 钱包
第一次看到 HD 这个词被用在比特币钱包中时,很容易就把它理解成硬件(Hardware)钱包,其实它是分层确定性(Hierarchical Deterministic)钱包的缩写 HD Wallets。
“分层确定性”这个词乍看起来很“高大上”,各类文档也把它描述的“云里雾里”的,其实原理本身很简单,两句话就能说清楚:
首先,要用一个随机数来生成主(根)私钥,这和任何一个比特币钱包生成任何一个私钥没任何区别;
然后,再用一个确定的、不可逆的算法,基于主私钥生成任意数量的子私钥;
看到了没?很简单吧?
那为什么要用“确定、不可逆”的算法呢?因为“确定”才能保证从一个主私钥可以生成出全部的子私钥,而“不可逆”则是为了确保不能通过子私钥反推出主私钥。
例如,SHA256 就可以看成是“确定、不可逆”的算法,我们可以很容易的使用 SHA256 设计出一个 HD 模型:SHA256(seed + n)
在这个模型里,seed 为主私钥,n=(1,2,3......)计算出来的结果对应于第(1,2,3......)个子私钥。
这其实就是类型1确定性钱包(Type1 HD Wallets),当然,我们还可以基于更多“确定、不可逆”的算法来设计其它 HD 模型,比如 BIP32,再比如类性2确定性钱包(Type2 HD Wallets)。算法可以复杂,但原理都一样,很简单,而且,只要 SHA256 是安全的,HD 模型就是安全的。
HD 模型在数学上有一个非常“好”的特性:只需要主公钥,就可以生成出任意数量的子公钥。也就是说,无需私钥介入(主私钥和子私钥),就能基于主公钥生成新(公钥)地址,而这些地址其实都能被主私钥所控制。
这个特性使得 HD 模型在过去一年里被越来越多的应用于企业和个人比特币钱包解决方案,可惜,优点往往伴随着代价,某些情况下,代价甚至是“致命的”。
下一篇文章中,小太将和您说说 HD 模型的潜在风险。
----------------------------------------------------------------------------------------------
本文不讨论HD的细节,仅谈其中潜在的风险。(有兴趣的童鞋可参考 http://www.8btc.com/hd-wallets 及 BIP32 的内容更深入的了解HD Wallets)
经常有用户建议我们支持分层确定性钱包(HD Wallets)功能,在过去的一年里,大家也能看到越来越多的钱包解决方案(如MultiBit等)开始HD化,也有越来越多的比特币企业开始利用HD来进行钱包管理,似乎只要是有了HD,人们就再也不用为私钥而头疼了,那真是这样的吗?
让我们先来了解一下到底什么是分层确定性(Hierarchical Deterministic)钱包,乍看起来,这个名词似乎很难理解,其实它的原理很简单,几句话就能讲清楚:
首先,用一个随机数来生成主(根)私钥;
然后,再用一个确定的、不可逆的算法,基于主私钥生成任意数量的子私钥;
为什么要用“确定、不可逆”的算法呢?因为“确定”才能保证从主私钥可以生成全部的子私钥,而“不可逆”则是为了确保不能通过子私钥反推出主私钥。
例如,SHA256就可以看成是“确定、不可逆”的算法,我们可以很容易的使用SHA256设计出一个HD模型(注:seed为主私钥):
SHA256(seed + n)
这其实就是(Type 1)确定性钱包。当然,我们还可以基于更多“确定、不可逆”的算法来设计其它HD模型,比如BIP32,再比如(Type 2)确定性钱包,算法可以复杂,但原理都一样,很简单。
选定了算法,我们还可以基于任何一个子私钥作为下一级的主私钥,继续使用相同算法来生成下一级的子私钥,也就是说,可以一层一层的树状结构向下生成,这就是为什么会称其为分层确定性的原因。
HD Wallets的特性和优点在某些情况下似乎特别适合企业和用户的一些需求(可参阅http://www.8btc.com/hd-wallets)
无论对于企业还是个人来说,比特币私钥管理总是件让人“头疼”的事,我们不仅需要多个地址、还需要区分冷热、并且考虑备份方式,这很麻烦。
考虑到这一点,有人“创新”的设计了一套分层确定性(Hierarchical Deterministic)模型来生成私钥,支持HD模型生成私钥的钱包被称为HD Wallets。
乍看起来“分层确定性”似乎很难理解,其实原理本身很简单,几句话就可以说清楚:
首先,用一个随机数生成主(根)私钥;
然后,用一个确定的、不可逆的算法,基于主私钥来生成任意数量的子私钥;
那么为什么要用确定的、不可逆的算法呢?这也很简单,因为“确定”才能保证从主私钥能生成全部的子私钥,而“不可逆”则是为了确保不能通过子私钥反推出主私钥。
最典型的“确定、不可逆”的算法就是SHA256,这样我们可以很容易的就设计出一个分层确定性模型(注:seed为主私钥):
SHA256(seed + n)
这其实就是类型1确定性钱包。
当然,基于相同的原理,我们可以设计出更多的“确定、不可逆”的算法来生成子私钥,比如说BIP32,再比如Armory所设计的类型2确定性钱包,算法可以复杂,但原理都一样,很简单。
确定了算法,我们还可以基于任何一个子私钥来作为下一级的主私钥,继续使用相同的算法来生成下一级子私钥,也就是说,可以是一层一层的树状结构向下生成,这就是为什么称其为分层确定性的原因。
好了,简单介绍完HD Wallets的原理,我在来说说这种模型的“优点”:
1、管理容易,只需保管好(备份)一个主私钥即可,通过主私钥可以生成全部的子私钥甚至是多级子私钥;
2、因为可以从父公钥生成全部子公钥,这意味着我们可以在不影响父私钥冷存储的情况下,生成任意数量的子地址用于比特币收款,这在电子商务场景下很有用,您可以为每个商品、每个用户、甚至是每笔交易都生成一个全新的比特币地址,而这个过程完全无需进行任何私钥管理;
3、多层树状结构很像是商业组织(如企业)的结构,比如说:总经理掌握主私钥,部门经理掌握1级子私钥,员工掌握2级子私钥(这能不能算成是优点,其实很值得商榷,因为如果真发生了比特币资产的丢失,到底该算到总经理、部门经理、还是员工的头上呢?);
4、更方便的审计,可以给会计或第三方审计任何一级上的公钥,他就可以看到该级下的所有交易,由于没有下一级私钥,只能审核(看),而不能花任何的币;
由于HD Wallets看起来优点多多,越来越多的钱包开始使用或支持这种解决方案,比如说:MultiBit HD、Electrum、Trezor等,甚至貔貅(云币)这个开源交易所平台据说也采用了这种模型来进行私钥管理。那么,HD Wallets到底好不好呢?
有不少用户在bitcointalk论坛上建议比太钱包支持HD Wallets,小太当时的回答是“我们未来可能会考虑哈”。现在,在这篇文章中,小太可以很认真的回答这个问题,那就是“我们不会考虑支持HD Wallets”,原因很简单,因为它不安全,如果在随机数不够安全的情况下,它甚至会放大风险,放大多少倍呢?也许是主私钥!
通过上面的原理性介绍,大家就应该能明白,整个HD Wallets的体系其实是构建在一个随机数(主私钥)之上的,虽然这种模型有着一些管理和审计上的优点,但如果暴露出任何一个小缺陷,就有可能导致整个体系的崩塌,千里之堤往往会毁于蚁穴,就是这个道理。
比如说,关于HD Wallets,有一个天生的、被大家讨论过多次的缺陷,即:主公钥+子私钥可以反推出主私钥。这在完美的情况下,不会有任何问题,企业和个人既不应该暴露主公钥,也不应该暴露子私钥。但即便比特币是完美的,并不代表使用比特币的企业或个人是完美的,也不代表第三方所开发的各种比特币钱包解决方案是完美的。
我们可能会因为各种原因暴露主公钥,比如为了第三方审计,再比如为了方便的新增地址而在网站服务器(企业)或热设备(个人)上存放主公钥,在这种情况下,主私钥可能的确做到了绝对的冷、绝对的安全,但主公钥显然存在暴漏风险。
在这种情况下,企业或个人如果能确保子私钥的安全,显然问题也不大,可是,通过小太之前两篇关于随机数的讨论,您就应该知道,如果基于不安全的随机数生成器进行签名,存在多种暴漏私钥的可能,对于一般的私钥来说,这可能导致单个私钥的暴漏,但对于HD Wallets来说,则可能由于暴漏单个子私钥而最终导致暴漏主私钥,这
千里之堤毁于蚁穴(慎用HD Wallets)的更多相关文章
- [转]HD钱包的助记词与密钥生成原理
本文转自:https://blog.csdn.net/opassf/article/details/79978047 区块链相关的话题持续发酵之时,应该不少人知道加密货币钱包,钱包是普通用户与加密货币 ...
- 分分钟搞懂 HD 钱包
转自:http://blog.sina.com.cn/s/blog_12ce70a430102v8c7.html 第一次看到 HD 这个词被用在比特币钱包中时,很容易就把它理解成硬件(Hardware ...
- 分层确定性钱包开发的代码实现(HD钱包服务)
HD Wallets的全称是Hierachical Deterministic Wallets, 对应中文是 分层确定性钱包. 这种钱包能够使用一组助记词来管理所有的账户的所有币种,在比特币的BIP3 ...
- 谈谈React那些小事
前言 说起React,那也是近一年多时间火起来的前端框架,其在Facebook的影响力和大力推广下,已然成为目前前端界的中流砥柱.在如今的前端框架界,React.Vue.Angular三分天下的时代已 ...
- 轻取帝国CMS管理员密码
“帝国”CMS是一套著名的PHP整站程序,是国内使用人数最多的PHPCMS程序之一.令人无奈的是,“帝国”虽然把势力壮大了,却忽略了自身防护的建设,结果在黑客攻击下,“帝国”沦陷了.“帝国”CMS曝出 ...
- 【重走Android之路】【Java面向对象基础(一)】数据类型与运算符
[重走Android之路][基础篇(一)][Java面向对象基础]数据类型与运算符 1.数据类型介绍 在Java中,数据类型分为两种:基本数据类型和引用类型. 基本数据类型共8种,见下表: 基本数 ...
- 故障排查实战案例——某电器ERP系统日志暴增
前言 本篇文章写在新春佳节前夕,也是给IT运维朋友一个警醒,在春节长假前请妥善体检自己的系统安心过个年. 千里之堤毁于蚁穴,一条看似简单的语句就能拖垮整个系统,您的SQL Server很久没体检了吧? ...
- 【转帖】2018年Windows漏洞年度盘点
2018年Windows漏洞年度盘点丨老漏洞经久不衰,新0day层出不穷 腾讯电脑管家2019-02-12共17875人围观 ,发现 1 个不明物体网络安全资讯 https://www.freebuf ...
- ethereumjs/ethereumjs-wallet
Utilities for handling Ethereum keys ethereumjs-wallet A lightweight wallet implementation. At the m ...
随机推荐
- [转] Linux中的默认权限与隐藏权限(文件、目录)
[From] https://blog.csdn.net/davidsky11/article/details/25424615 一个文件(或目录)拥有若干个属性,包括(r/w/x)等基本属性,以及是 ...
- B: Break Prime
题目描述 给定一个素数,试判断能否将该素数写为b3−a3 的形式,a,b皆为非负整数. 输入 多组输入 每行一个素数P (2≤P≤1015) 输出 若可以分解输出a,b(a<b) ,不能输出 ...
- Python数据分析学习之Numpy
Numpy的简单操作 import numpy #导入numpy包 file = numpy.genfromtxt("文件路径",delimiter=" ",d ...
- c++ 常用的遍历,删除,分割等等文件处理函数代码实现
原文作者:aircraft 原文链接:https://www.cnblogs.com/DOMLX/p/9622851.html 删除文件目录函数: void myDeleteDirectory(CSt ...
- Unity5.x在mac下的破解
工具下载 http://www.ceeger.com/forum/read.php?tid=23396&uid=24111 破解unity5.x版本亲测有效 但是他的说明不详细 下载后,里面有 ...
- 8086处理器的无条件转移指令——《x86汇编语言:从实模式到保护模式》读书笔记13
本博文是对原书8.3.10的内容的总结. 一.相对短转移 指令格式是: jmp short 标号 标号也可以替换成具体的数值(标号和数值是等价的),例如 jmp short 0x2000 说明: (1 ...
- 日调度万亿次,微服务框架TSF大规模应用——云+未来峰会开发者专场回顾
欢迎大家前往腾讯云+社区,获取更多腾讯海量技术实践干货哦~ 演讲者:张浩 腾讯云中间件产品负责人 背景:众多开发者中,一定经历类似的甜蜜烦恼,就是当线上业务规模越来越大,系统分支发展越来越多的时候,初 ...
- 【.Net】 【C++】容器类型对照
C# 中主要有两类容器:一个是 System.Array 类(参阅:http://msdn.microsoft.com/library/default.asp?url=/library/en-us/c ...
- NPM 与前端包管理
我们很清楚,前端资源及其依赖管理一直是 npm 的重度使用场景,同时这也一直是 Node.js 普及的重要推动力.但这类应用场景到底有多重度?这是一个很难回答的问题.这份 “npm 最常下载的包的清单 ...
- 清除SQL Server内存
数据库进行查询时,会缓存结果集,当查询结果过大时会出现内存爆满的情况,如果手动清除SQL所占用的内存呢,在网上搜索一下,把结果贴下面: --强制释放内存 Create procedure [dbo]. ...