比特币安全知识点:HD钱包

HD钱包(分层确定性钱包)
HD钱包(Hierarchical Deterministic)

HD钱包根据“种子”(种子密钥)按顺序导出未来的地址,每个新地址相当于“种子+计数器”。通过这种方式,你只用一个种子就可以恢复所有的私钥和地址。

05/25/2018 06:58 上午 posted in  BlockChain

比特币『私钥』『公钥』『钱包地址』间的关系

转自:http://www.bikeji.com/t/110#reply25
比特币交易涉及到很多密码学知识:公钥、私钥、哈希、对称加密、非对称加密、签名等等。那么哪些是需要用户认真保管不能对外泄露的,那些是需要用户公开的呢?先从钱包地址的生成说起。

首先使用随机数发生器生成一个『私钥』。一般来说这是一个256bits的数,拥有了这串数字就可以对相应『钱包地址』中的比特币进行操作,所以必须被安全地保存起来。
『私钥』经过SECP256K1算法处理生成了『公钥』。SECP256K1是一种椭圆曲线算法,通过一个已知『私钥』时可以算得『公钥』,而『公钥』已知时却无法反向计算出『私钥』。这是保障比特币安全的算法基础。
同SHA256一样,RIPEMD160也是一种Hash算法,由『公钥』可以计算得到『公钥哈希』,而反过来是行不通的。
将一个字节的地址版本号连接到『公钥哈希』头部(对于比特币网络的pubkey地址,这一字节为“0”),然后对其进行两次SHA256运算,将结果的前4字节作为『公钥哈希』的校验值,连接在其尾部。
将上一步结果使用BASE58进行编码(比特币定制版本),就得到了『钱包地址』。
比如, 1A1zP1eP5QGefi2DMPTfTL5SLmv7DivfNa
##『私钥』『公钥』『钱包地址』间的关系
在上述的五个步骤里只有“BASE58编码”有相应的可逆算法(“BASE58解码”),其他算法都是不可逆的,所以这些数据之间的关系可以表

可以看到:
通过『私钥』可以得到上述计算过程中所有的值。
『公钥哈希』和『钱包地址』可以通过互逆运算进行转换,所以它们是等价的。

##使用『私钥』对交易进行签名
比特币钱包间的转账是通过交易(Transaction)实现的。交易数据是由转出钱包『私钥』的所有者生成,也就是说有了『私钥』就可以花费该钱包的比特币余额。生成交易的过程如下:

交易的原始数据包括“转账数额”和“转入钱包地址”,但是仅有这些是不够的,因为无法证明交易的生成者对“转出钱包地址”余额有动用的权利。所以需要用『私钥』对原始数据进行签名。
生成“转出钱包公钥”,这一过程与生成『钱包地址』的第2步是一样的。
将“转出签名”和“转出公钥”添加到原始交易数据中,生成了正式的交易数据,这样它就可以被广播到比特币网络进行转账了。
##使用『公钥』对签名进行验证

交易数据被广播到比特币网络后,节点会对这个交易数据进行检验,其中就包括对签名的校验。如果校验正确,那么这笔余额就成功地从“转出钱包”转移到“转入钱包”了。
小结
如果一个『钱包地址』从未曾发送余额到其他『钱包地址』,那么它的『公钥』是不会暴露在比特币网络上的。而公钥生成算法(SECP256K1)是不可逆的,即使『公钥』暴露,也很难对『私钥』的安全性造成影响(难易取决于『私钥』的生成算法)。
『私钥』用来生成『公钥』和『钱包地址』,也用来对交易进行签名。拥有了『私钥』就是拥有了对这个钱包余额的一切操作权力。所以,保护『私钥』是所有比特币钱包应用最基本也是最重要的功能。

本文仅讨论标准P2PKH交易方式,P2SH不在讨论范围内。
历史上发生过校验错误的交易被打入到blockchain中的事情,这种交易中的比特币永远地消失在Cyberspace中了。

05/11/2018 08:08 上午 posted in  BlockChain

比特币的密钥(yue)、公钥、和地址之间的概念理解

随机取32个字节的【秘钥】

---》椭圆加密算法 ----》【公钥】(压缩的话,只取前面的32位。)

-----》sha256 ----》哈希160 ---》生成【公钥哈希】

然后比特币程序会加上校验码(【公钥哈希】进行两次sha256后取前4个字节)和比特币主网版本号(0x00)形成 最终的【地址】

私钥 >> 公钥 >> 两个【公钥哈希】(压缩【公钥哈希】和非压缩【公钥哈希】)

1.从2个公钥哈希(两个或者任意一个都无法),无法推导出【公钥】。
2.但是从【公钥】 公钥哈希可以推导出 【公钥哈希】
3.【私钥】可以推导出 两个【公钥哈希】和【公钥】,但是反过来,无论是【公钥】还是【公钥哈希】都无法推导出【密钥】

交易的验证理解:

  1. 交易数据的签名只用密钥的拥有者可以生成(加密),而且这个签名加上公钥运算后(解密)可以得到交易数据(明文),只需要将得到的明文跟真实的明文做对比即可知道该交易是否为私钥拥有者发起。
  2. 而一个公钥有且仅有一个【公钥哈希】(即账户地址),我们可以通过公钥哈希算出需要被扣款的比特币地址。
  3. 一个公钥只能对应一个私钥,
  4. 一个私钥允许对多个公钥,这个类似于,一个人拥有多张银行卡,但椭圆算法不存在这种情况,也就是说一个秘钥只有一个公钥和他对应。
  5. 秘钥相同,公钥也相同,所以竟可能的把秘钥设计的复杂一点,避免被别人猜中你的秘钥。
  6. 由于地址是由【公钥】经过两次sha256算出来的,所以理论上不存在哈希碰撞,因此一个【比特币账号地址】只能由一个【公钥】推导出来,而公钥是唯一的,所以【地址也是唯一的】
  7. 可以理解为【秘钥】是唯一的和【椭圆算法】生成的【公钥】也是唯一的,而假定【公钥两次sha256生成的值】也是唯一,所以【地址】是唯一的。即,一个【秘钥】对应一个【公钥】对应一个【地址】

私钥(Private Key)

比特币的私钥是由64位十六进制的字符组成,长得像这样,比如:5KYZdUEo39z3FPrtuX2QbbwGnNP5zTd7yyr2SC1j299sBCnWjss。

私钥的生成方式是完全随机的,随机生成这样的字符串就会有16的64次方种可能,即:2的256次方,这个数字已经超过了宇宙中原子的个数,用“暴力破解”的方式逐一遍历可能的私钥,幻想能碰到一个有效的且有币的私钥,可以说是不可能,就算是量子计算机也没用。

目前已存在的比特币私钥仅仅只有几百万个,在理想的随机生成方式下(用密码学安全的随机数生成器),如果说你所生成的私钥恰好跟别人的私钥一样,这种概率也是几乎为0。

私钥的本质就是个随机数。只不过这个数字是固定长度的,且是16进制的表现形式。

地址

大家都知道,公钥跟私钥是成对的,公钥由私钥计算而来,地址则通过公钥进一步计算而来。要注意:地址不是公钥,不要混淆概念。总之,有了私钥,就可以推导出它的公钥以及地址,地址一般长这样:1GczaiHaFpmucRHRe88RXCAVZ6gTZAoS57(这是我的比特币地址,打赏可以转我比特币试试:)),一般长34位,由私钥可以根据算法推导出地址,但有地址不能逆推出私钥,这是比特币所使用的密码学的根基逻辑。

所以,地址可以随便公开,而私钥则万万不能公开。

助记词(Mnemonic Phrase)

由于私钥64位,长得太难看,没有可读性,而私钥的备份在电脑上复制起来容易,手抄下来就比较麻烦,但私钥保存在联网的电脑上毕竟不安全,有被其他人看到的风险,于是有了助记词工具,利用某种算法可以将64位私钥转换成十多个常见的英文单词,这些单词都来源于一个固定词库,根据一定算法得来。私钥与助记词之间的转换是互通的,助记词只是你的私钥的另一种外貌体现。

助记词一般会在你创建新钱包的时候出现一次,后面就再也不会出现了,所以创建新钱包时最好把助记词抄下来、甚至放到保险柜里,自己想办法备份。如果是屏幕截图或保存在电脑里,只要设备联网都有被第三只眼看见的风险。别人获取了你的助记词等于获取了私钥所对应的一切财富。

简而言之:助记词就等于私钥,私钥就是钱,都千万不能见光。

05/11/2018 08:02 上午 posted in  BlockChain

区块链的概念和应用

从狭义上来讲,区块链是一种按照时间顺序将数据区块以顺序相连的方式组合成的一 种链式数据结构,并以密码学方式保证的不可篡改和不可伪造的分布式账本;而从广义上来讲,区块链技术是利用块链式数据结构来验证与存储数据、利用分布式节点共识算法来生成和更新数据、利用密码学的方式保证数据传输和访问的安全、利用由自动化脚本代码组成的智能合约来编程和操作数据的一种全新的分布式基础架构与计算范式。

由于区块链技术具有去中心化、开放性、自治性、匿名性、信息不可篡改等天然特性,因此被认为是继蒸汽机、电力、互联网之后,下一代颠覆性的核心技术。而这种颠覆,并不是我们通常所说的提升效率,而是对生产关系的一种重构,进而改变整个世界。

从这个意义上说,区块链受到了极大的追捧,从而在近年来大火特火。

一般来说,业内比较认可的、可以用区块链的一些领域大概有智能合约证券交易电子商务物联网社交通讯文件存储存在性证明身份验证股权众筹等。不过从技术发展阶段上来看,目前在金融领域,区块链的应用是相对最为成熟的。

自从诞生以来,区块链已经经过了三次演化,分别是:区块链1.0、区块链2.0和区块链3.0,而每一个阶段都有其对应的应用。

具体来说,区块链1.0就是比特币。不过除此之外最著名的当属瑞波币(Ripple)、莱特币等,其最重要的功能是支付。由于瑞波币拥有极为便利的国际转账支付功能,因此包括国内多家银行在内的全球很多银行目前都在使用瑞波币系统。同时,银行与瑞波币的合作也被看做是银行在拥抱区块链技术、寻求自身发展变革的标志。

随后,区块链技术进入了2.0时代,以太坊(ETH)和EOS等为其典型代表。区块链2.0有了一个重要功能:智能合约,它突破性的解决了区块链的互信难题,使得交易更加安全。其中公信宝(GXS)被看做是比较成功的一个应用,在银行、保险、证券领域有着不小的市场。

目前,已经发展到了区块链3.0时代,DAO(区块链自治组织)、DAC(区块链自治公司)等相继出现。他们坚信区块链将在未来彻底改变世界,不过,除了在物联网(IOTA,网易近期也在积极布局)等少数领域之外,尚未发现有价值的应用点。

区块链生态系统逐渐完善,部分地方政府开始试水

可以说,国内的区块链技术与应用并不落后于国外,甚至有某些方面还有所超越。但尽管如此,国内的区块链生态系统目前还只是处于起步的初级阶段,不过在各行各业已经引起了广泛关注,并且开始有越来越多不同细分领域的积极探索和试验。

苏州同济金融科技研究院副院长祝文伟说:“区块链技术作为一项底层技术,基于其基本特点,最初主要解决的是交易的信任和安全问题,区块链上的所有交易都会在全网进行备案;而由于其‘分布式及去中心化’的明显特征,区块链技术初期在供应链溯源、身份验证、防伪存证、电子档案等行业有相对较明显的应用优势和前景。”

区块链系统最初以矿场、矿机、矿池结合云算力体系形成了行业基础设施体系,随着以数字货币、电子钱包和交易所构成的数字资产体系的不断发展,以及区块链行业应用解决方案的不断落地。可以说,目前国内的区块链生态系统闭环正在形成。

对于区块链的未来发展前景,INB基金投资经理李万才认为,区块链将会实现真正的意义上的、全面彻底的业态颠覆,“与AI对行业的促进和提升效率不同,区块链对行业的颠覆完全是不同量级的。”

正是因为区块链的前景巨大,因此,随着区块链进入“寒武纪大爆发”,各地政府也开始纷纷布局这一新兴技术和产业。

就在上个月23日的“链谷成果、政策、场景规划”发布会上,苏州高铁新城管委会正式发布《区块链产业发展扶持政策》,业内也称“苏九条”,细分为落户扶持、经营扶持、人才扶持、平台扶持等9条内容。

比如,在落户扶持中,当地政府将成立专项服务小组,对入驻的区块链企业提供场景落地的对接服务,据悉2018年将开放30个场景;对新设立经认定的区块链企业或机构,提供不超过1000平方米的场地,并实施租金“两免三减半”政策,每年每家企业租金补助金额最高不超过60万元。在经营扶持中,对区块链企业(机构)按年度收入的不同,分别给予10万元、20万元、100万元、200万元的一次性奖励。用最优的服务、开放的场景、真金白银向区块链行业从业者发出诚挚的邀请。

区块链虽然发展迅速,但目前还远远没有成熟
虽然近年来,关于区块链的公司很多,资本也在大肆追捧,但我们仍然不能说区块链已经很成熟了。正如李万才也在观点中表示,“区块链(暂时还尚未成熟),可能在几年内会有成熟的行业应用出来,并让它逐渐走进大众视野。”

长期关注和解读区块链的“白话区块链”公众号创始人馋嘴猫也持有同样观点,“区块链目前还没有有价值的行业应用,区块链技术也并未具有完全的不可替代性;同时,区块链技术本身发展阶段也在初期,比如它对银行账单的处理效率就相当低下。”

据馋嘴猫介绍,目前比特币的处理速度最多每秒7笔交易,作为区块链2.0的以太坊也只是15-20笔交易左右。这个效率还难以在现实世界中发挥作用。

此外,从技术的人才储备上看,国内的情况更是不容乐观。据业内知情人士透露,“目前我们具有区块链开发能力的人才太少,国内真正具备开发能力的技术人员只有100人左右,最多不会超过200人。”

布比区块链创始人兼CEO蒋海认为,目前区块链技术层面还存在很大的改进和提升空间。

他说:“关于改进和提升,主要体现在两大个方面:第一是性能,区块链的处理性能有待进一步突破。由于采用多中心机制,要保证一致性和共识,规模与效率的均衡,这是一个难题。

“其次是隐私保护和权限控制。在实际商业应用中,需要具备隐私保护和权限控制等功能,共享与保护的均衡,是另一个难题。”

而国内更有对区块链持更加悲观甚至抵制态度的也大有人在,如2017年年底金沙江创业投资基金董事总经理朱啸虎就曾直言不讳地说:“我始终认为99.99%通过区块链/ICO融资的项目都是骗子!”

结语:
苏州同济金融科技研究院副院长祝文伟说:“随着技术和行业的不断发展,行业解决方案将基于侧链、交叉链、间隔链等的技术应用演变,进一步影响金融交易的清算和结算、电子商务支付和转账、物联网、网络安全、公正防伪、社交网络、慈善公益、版权交易、交通能源等各个产业。也许,未来的区块链技术真的能对目前的互联网行业应用进行改革性的颠覆和转换,最终,时间将给出答案和验证。”

01/11/2018 16:51 下午 posted in  BlockChain

ZCash零知识证明

交易过程完全匿名是数字货币ZCash最大的亮点,正是这一点使得ZCash自提出以来便备受关注。ZCash匿名交易的实现依赖于一种叫做“零知识证明”的密码学手段。本文将通过打比方的手法,用通俗的语言,解释清楚ZCash的交易原理,以及零知识证明是如何运用到ZCash交易过程中的。
本文的嘉宾是数字货币界最著名CP:Alice和Bob。
一、从比特币说起
直接讲解ZCash的交易过程可能会比较抽象。为了有助于理解,我们不妨先分析比特币,作为铺垫。
我们先来打个比方说明比特币的转账原理。
演示场景:Alice转1个比特币给Bob。
转账前,Alice要事先准备1个比特币。为了方便理解,我们把Alice准备转出的这1个比特币看成一张面额为1个比特币的“支票”,如图1。


图1
从这张“支票”中我们可以获取到如下信息:

  1. Alice确实拥有1个BTC。
  2. Alice使用私钥对这张支票签名,证明Alice拥有对这笔资产转账的权力。
    支票的面额和转账权都已经明确,Alice就可以给Bob转账了。转账的原理很简单,就是给Bob新建一张一样的“支票”,证明Bob拥有了1个比特币。同时撕掉Alice手中的“支票”,通过这“破旧”并“立新”的方式,实现资产所有权的转移。如图2。


图2
以上逻辑其实不难理解,因为这和日常生活中的银行转账是一个道理。通过银行转账,我们在交易时不必对实物货币进行转移,而是以银行记账的方式,实现“资产所有权”的转移。比特币交易的过程实质上就是一个“资产所有权”的转移过程,转入比特币的那一方“新建”一份资产所有权,而转出方需要“销毁”原先的资产所有权,被销毁的那张“支票”永远不会再出现。
二、ZCash的转账原理
与比特币一样,ZCash的交易过程也是 “资产所有权”的转移。继续沿用前文“支票”的比方。
演示场景:Alice转1个ZEC给Bob。
转账前,Alice创建一张面额为1个ZEC的“支票”,如图3。


图3
能从该凭证中获取的信息:

  1. Alice确实拥有1个ZEC。
  2. Alice使用私钥对这张支票签名,证明Alice拥有对这笔资产转账的权力。
  3. 这张“凭证”上多了一串随机数,用符号 r 表示。这串随机数的作用好比“支票代号”,用来唯一识别该支票。Alice的“支票代号”为r1。
    明确以上信息,Alice就可以进行ZEC转账了。
    第一步:比特币一样,要先为Bob新建一张“支票”。Bob的支票代号(r2)与Alice的支
    票代号(r1)不相同,如图4。


图4
第二步:新的“资产所有权”生成的同时,必须要想办法销毁原来的“资产所有权”。即必须想办法让Alice手中的“支票”失效。与比特币简单粗暴的“直接撕毁”不同,ZCash采用“备注作废”的手段,达到同样的效果。怎么理解呢?就是在不对原先“支票”作任何处理的前提下,新建一个作废文件列表,录入需要作废的“发票代号”。如图5,


图5
从上图可以看出,原先的Alice持有的支票仍旧存在,并没有消失,只是这张支票已经被记入“作废列表”。在确定资产所有权时要同时读取两个列表的信息,能确定Bob拥有资产所有权的判断方法是:作废列表中不存在Bob所持“支票”的代号。
可是为什么要这样设计呢?其实这样设计的目的是为了在交易过程中运用 “零知识证明”。
三、零知识证明
什么是零知识证明?
零知识证明 (被称为“zk-SNARK”)是实现Zcash的匿名特性的核心技术。“零知识证明”的定义是:证明者能够在不向验证者提供任何有用的信息的情况下,使验证者相信某个论断是正确的。举个简单的例子:
A要向B证明自己拥有某个房间的钥匙,假设该房间只能用钥匙打开锁,而其他任何方法都打不开。这时有2个方法:
(一)A把钥匙出示给B,B用这把钥匙打开该房间的锁,从而证明A拥有该房间的正确的钥匙。
(二)B确定该房间内有某一物体,A用自己拥有的钥匙打开该房间的门,然后把物体拿出来出示给B,从而证明自己确实拥有该房间的钥匙 。
后面这个方法属于零知识证明。好处在于在整个证明的过程中,B始终不能看到钥匙的样子,从而避免了钥匙的泄露。
那么零知识证明怎么运用到ZCash交易过程中呢?
我们再回顾比特币和ZCash的例子。
Alice要向Bob转一个单位的数字货币(BTC/ZEC),即Alice要向Bob转移一个单位的资产所有权。这时有以下两个方法:
(一)比特币中的做法:Alice拥有一张1BTC的支票,要转账给Bob时,先给Bob新建一张1BTC的支票,同时当着Bob的面将自己原先的支票撕毁。
(二)ZCash中的做法:Alice拥有一张1ZEC的支票,要转账给Bob时,先给Bob新建一张1ZEC的支票,然后在一张约定有效的作废列表中,记录下Alice的发票的代号,证明Alice的支票已经失效。
ZCash的方法属于零知识证明。整个交易过程中,Bob并没有见过Alice的支票,但是还是实现了资产所有权的转移。在ZCash的整个交易系统中,Alice和Bob的交易还有其他见证者,即负责记录交易信息的矿工。同样道理,矿工也不必看到Alice的支票,只要能确定代号为r1的支票已经作废了就行。
四、ZCash完整的匿名交易系统
有了上述铺垫,就可以进一步解释ZCash的匿名交易过程了。
还是那个例子:Alice转1 个ZEC给Bob。这个例子中有涉及到的角色有转账双方Alice和Bob,以及记账者(矿工)。
首先是Alice和Bob都有了一张支票,如图6。


图6
这两张“支票”都是有效的。Alice的支票开始就存在于整个ZCash网络,Bob的支票在生成后也会被广播到全网。
为了隐藏交易者信息,要对两张支票进行加密处理。在全网中存在的“支票”其实是这样子的,如图7。

信息都是被加密的,可以通过拥有者的私钥解密

图7
同时,因为资产只能有一份,所有矿工手里还有一个作废列表。Alice要同时广播自己的“发票代号”,录入作废列表中。发票代号也是加密的。所以矿工们能看到的信息其实是这样的。其中Alice的支票是原先存在的,Alice的支票代号r1和Bob的支票是在交易过程中被Alice广播的。如图8。


图8
矿工们能获取的信息相当有限,但是这并不影响对矿工对交易有效性的判断。
判断的逻辑相当简单:矿工拿到Alice给的支票代号r1,去作废列表中检索,假如作废列表中已经存在r1,则证明r1所对应的的支票早已失效;若作废列表中并不存在r1,则证明r1对应的支票仍旧有效,此时矿工把r1录入作废列表中,把新生成的支票录入支票列表中。所以记账的过程就是对原有支票登记失效,并存入现有支票的过程。
在这个过程中,我们不难发现,每笔交易矿工能接收到的东西只有一个发票代号,和一张新的发票,而且这两样东西都是被加密的。所以矿工并不知道转账双方是谁,也不知道转账金额是多少。
五、数据库
其实有心人可以发现,按照上文的思路,能写一个用于ZCash匿名交易的数据库。笔者后续的文章中会另起一文专门写数据库的构建。
本文为雷盈特邀作者Carlos原创文章,雷盈(公众号:RadarWinChina)是上海区块链标杆企业,为区块链全产业链提供技术与咨询服务

10/17/2017 09:42 上午 posted in  BlockChain