转自:http://blog.sina.com.cn/s/blog_12ce70a430102vbu9.htmlhtml
千里之堤毁于蚁穴(慎用HD Wallets)
-- 随机系列谈之四
如今咱们都该明白,不管怎样强调随机对于比特币的重要性都不为过,随机的确称得上是比特币的“命根子”。
在过去的几篇文章中,小太已经介绍过了一些因随机问题可能致使私钥暴漏的状况,今天,我再跟你们聊聊分层肯定性(Hierarchical Deterministic)钱包。
HD Wallets因其“只须要一个主(根)私钥,就能生成海量子私钥”这个特性广受欢迎,在过去的一年里,愈来愈多的钱包解决方案和比特币企业开始支持或采用HD模型来进行私钥管理,但是,大部分人并未意识到其中可能存在的潜在风险。(本文不讨论HD的原理,有兴趣的童鞋可参阅《分分钟搞懂HD钱包》 http://blog.sina.com.cn/s/blog_12ce70a430102v8c7.html 及 BIP32 规范中的相关说明)
HD模型的最大优势是不使用私钥就能生成大量的由您掌握的地址,其原理就在于直接经过主公钥就能够生成任意数量的子公钥,整个过程无需访问主私钥。这个特性有以下好处:
一、备份容易,只需备份主私钥,新增地址无需再次备份私钥;
二、保证主私钥的冷存储,不管新增多少个地址,仅需主公钥就能完成,无需主私钥介入;
三、方便的第三方审计,只需给第三方机构或会计提供主公钥,他就能够看到全部下级地址的交易,但又不能花费任何币(由于没有子私钥);
由于HD模型的这些好处,钱包解决方案和比特币企业就能够很方便的进行私钥管理。好比说,电子商务网站或交易所就能够在网站服务器上存放主公钥,而后按需新增子地址,对每一个用户、每一个商品甚至每笔交易都使用一个全新的比特币地址,而整个过程不会涉及冷存储的主私钥;再好比说,我的能够冷存储主私钥,在热设备上存放主公钥,就能方便的生成任意数量的地址,知足本身不断新增地址而又无需备份私钥的需求。
但这些好处实际上是有代价的,由于HD模型有一个天生的“缺陷”(不管是Type一、Type二、仍是遵循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级子私钥(这能不能算成是优势,其实很值得商榷,由于若是真发生了比特币资产的丢失,到底该算到总经理、部门经理、仍是员工的头上呢?);
四、更方便的审计,能够给会计或第三方审计任何一级上的公钥,他就能够看到该级下的全部交易,因为没有下一级私钥,只能审核(看),而不能花任何的币;
因为HD Wallets看起来优势多多,愈来愈多的钱包开始使用或支持这种解决方案,好比说:MultiBit HD、Electrum、Trezor等,甚至貔貅(云币)这个开源交易所平台听说也采用了这种模型来进行私钥管理。那么,HD Wallets到底好很差呢?
有很多用户在bitcointalk论坛上建议比太钱包支持HD Wallets,小太当时的回答是“咱们将来可能会考虑哈”。如今,在这篇文章中,小太能够很认真的回答这个问题,那就是“咱们不会考虑支持HD Wallets”,缘由很简单,由于它不安全,若是在随机数不够安全的状况下,它甚至会放大风险,放大多少倍呢?也许是主私钥!
经过上面的原理性介绍,你们就应该能明白,整个HD Wallets的体系实际上是构建在一个随机数(主私钥)之上的,虽然这种模型有着一些管理和审计上的优势,但若是暴露出任何一个小缺陷,就有可能致使整个体系的崩塌,千里之堤每每会毁于蚁穴,就是这个道理。
好比说,关于HD Wallets,有一个天生的、被你们讨论过屡次的缺陷,即:主公钥+子私钥能够反推出主私钥。这在完美的状况下,不会有任何问题,企业和我的既不该该暴露主公钥,也不该该暴露子私钥。但即使比特币是完美的,并不表明使用比特币的企业或我的是完美的,也不表明第三方所开发的各类比特币钱包解决方案是完美的。
咱们可能会由于各类缘由暴露主公钥,好比为了第三方审计,再好比为了方便的新增地址而在网站服务器(企业)或热设备(我的)上存放主公钥,在这种状况下,主私钥可能的确作到了绝对的冷、绝对的安全,但主公钥显然存在暴漏风险。
在这种状况下,企业或我的若是能确保子私钥的安全,显然问题也不大,但是,经过小太以前两篇关于随机数的讨论,您就应该知道,若是基于不安全的随机数生成器进行签名,存在多种暴漏私钥的可能,对于通常的私钥来讲,这可能致使单个私钥的暴漏,但对于HD Wallets来讲,则可能因为暴漏单个子私钥而最终致使暴漏主私钥,这算法