“密码学家的工具箱”中一共包含了6种基本的密码技术。分别是对称密码、公钥密码、单向散列函数、消息认证码、数字签名以及伪随机数生成器。

比特币是一种虚拟货币,也叫密码学货币。

比特币可以脱离物理介质,仅通过互联网就可以流通。

密码技术总结

密码技术算法作用问题
对称密码AES加解密,确保消息的机密性。密钥配送问题
公钥密码RSA、ElGamal和Rabin算法加解密,确保消息的机密性,解决对称密码的密钥配送问题存在中间人攻击风险
单向散列函数SHA-2(SHA-224、SHA-256、SHA-384、SHA-2)、SHA-3长消息转短散列值,确保消息完整性。
消息认证码HMAC防篡改,确保消息完整性,对通信对象进行认证。无法防止否认,无法对第三方进行认证。
数字签名RSA、ElGamal、DSA、椭圆曲线DSA(ECDSA)、爱德华兹曲线DSA(EDDSA)等对第三方进行认证、防止通信对象否认无法预防中间人攻击,需要可信认证机构
伪随机数生成器密码和单向散列函数技术生成具备不可预测性的比特序列、用于生成密钥、初始化向量IV以及nonce。

密钥配送问题还可以使用Diffie-Hellman密钥交换(DH)椭圆曲线Diffie-Hellman密钥交换技术(ECDH) 等技术。

公钥密码的使用前提是确认自己持有的公钥的合法性,如果无法确认公钥的合法性,公钥密码就无法发挥作用。

消息认证码是使用共享密钥和单向散列函数生成认证码,只有拥有共享密钥的另一方才能够认证。

数字签名是私钥对消息的散列值进行签名,公钥验证签名防止否认。

框架化

框架的特点就是能够对其中作为组成元素的技术进行替换

消息认证码算法HMAC的设计就允许对单向散列函数的算法进行替换。

在PGP中,对称密码、公钥密码、单向散列函数等都是可以替换的。在SSL/TLS中,客户端和服务器可以通过握手协议进行通信,并当场决定所使用的密码套件。

密码技术的框架化是通过将单独的密码技术像零件一样组合起来,并根据需要进行替换,能够事先更长期的、更高的安全性。

密码技术与压缩技术

密码技术作用原理压缩技术
对称密码、公钥密码通过保护较短的密钥来保护较长的明文机密性的压缩
单向散列函数通过检查较短的散列值来确认较长的明文的完整性完整性的压缩
消息认证码、数字签名通过认证较短的认证符号(消息认证码和数字签名)来对较长的消息进行认证认证的压缩
伪随机数生成器通过随机数种子来生成不可预测的随机数序列不可预测性的压缩

比特币

比特币是一种虚拟货币,也叫密码学货币。

比特币的单位如下表

比特币单位(缩写)
1bitcoin(BTC)
0.01bitcent(cBTC)
0.001millibitcoin(mBTC)
0.000001microbitcoin(uBTC)
0.00000001satoshi

与其说比特币是一种货币,不如说比特币是一种基于P2P网络的支付结算系统

比特币用户通过使用这一种结算系统,实现了价值的转印,这才是比特币具有货币的特征。

地址

比特币交易时在比特币地址之间完成的。

比特币中使用的地址是由公钥的散列值生成的。具体来说,将椭圆曲线DSA的公钥输入SHA-256和RIPEMD-160两个单向散列函数来求出散列值,再附加一些信息后通过Base58Check进行编码,转换为字符串。

Base58Check编码中不适用数字0、大写O、大写I以及小写i。

钱包

和发送邮件类似,比特币交易也是一样,需要使用比特币的客户端,该客户端称为钱包

用户通过钱包生成密钥对,并据此在互联网上进行交易。

公钥用于接收比特币,而私钥用于支付比特币。

私钥保存在钱包中,和一般的密钥对的管理办法一致,不能泄露。

区块链

区块链是保存比特币全部交易记录的公共账簿。

全世界使用比特币进行的所有交易都被保存在这一本公共账簿中。

区块链就是将交易以区块为单位组织起来。

比特币交易是如何通过区块链实现的?

假设从账户A到账户B触发了一次交易,交易金额是1BTC。完成这次交易需要以下两个步骤:

  1. 地址A所能够支付的比特币数量减少1BTC。
  2. 地址B所能够支付的比特币数量增加1BTC。

支付的本质是“将地址A中减少的金额增加的地址B中”。

如果有一本公共账簿(区块链),记录了比特币体系中所有的地址至今为止所有的交易,那么对于任意一个地址,都能够计算出当前它所有用的比特币数量

存在问题:最初用户地址中的能够支付的比特币是哪来的?

挖矿

交易成立的前提是一方必须拥有一定量的比特币。

只有成功向区块链中添加符合条件的区块才会得到奖励的比特币以及该区块所有交易的手续费

由于计算或者说寻找符合条件的区块就像是从金矿中淘金一样,因此被称为挖矿,而从事挖矿的人称为矿工

符合条件的区块指的是新生成的区块拥有合法的区块头,具体就是区块头中包含的“前一区块头的散列值”的格式要符合规定,该格式指的是散列值的前若干个比特必须为0

区块头中之所有需要一个称为nonce的任意数值,就是为了计算出这种前面若干个比特都是0的新散列值。

这样看来计算符合条件的前一区块的散列的变量有两个,一是前一区块所有交易的散列值,需要实时获取;另一个是nonce随机数,也需要实时更新。

这和暴力破击单向散列函数十分相似。

比特币系统中大约10分钟会添加一个区块,为了保持这样恒定的速率,计算的难度可以不断地调整(通过所需0的格式)。

区块的添加

比特币的收付款是以交易为单位进行的,若干条交易会被合并为一个区块,并被添加到区块链中。

当P2P网络取人区块的添加后,相应的交易也就成立。

如上图所示,

  1. 一个区块是由若干条交易以及一个区块头所组成的。
  2. 区块头中保存了“上一个区块的区块头的散列值”。
  3. 区块头中还保存着“本区快所有交易的整体散列值”。
  4. 区块头中还保存着一个名为nonce的任意数值,以及时间戳等信息。

上图区块2中的散列值H2是区块1中的区块头1算出来的,散列值T2是根据区块2中记录的所有交易数据计算的。

假设区块2中某条交易被修改,那么散列值T2就需要重新计算,会导致区块头2的内容发生变化,进而导致之后的区块都要重新计算。

由此区块头中的两个散列值有效增加了篡改区块链数据的难度

交易

当账户A和账户B发生了1BTC的交易,交易流程如下:

sequenceDiagram participant P2P网络 participant 账户A participant 账户B autonumber 账户B->>账户B: 创建公钥密钥对(公钥B和私钥b) 账户B->>账户B: 根据公钥B生成地址B 账户A->>账户A: 创建公钥密钥对(公钥A和私钥a) 账户A->>账户A: 根据公钥B生成地址A 账户B->>账户A: 地址B 账户A->>账户A: 创建交易(从地址A向地址B转移1BTC) 账户A->>账户A: 并用私钥a对交易进行数字签名 账户A->>P2P网络: 交易

当该交易与其他一些交易被合并到区块,并添加到区块链之后,地址A能够支付的金额就减少了1BTC,而地址B能够支付的金额增加了1BTC。(这和现实世界中的转账操作类似)

在创建交易时运用了数字签名技术。比特币中使用的数字签名算法为椭圆曲线DSA,其中所使用的椭圆曲线方程为$x^{2}=y^{3}+7$。

确认

由于全世界大量矿工在不断尝试添加新的区块,如果某个时间点出现多个矿工同时计算出符合要求的散列值,区块链就有可能产生分支。

由于比特币时一个P2P网络,因此无法确定是哪一个区块先到达的节点,比如节点1可能先收到区块A,节点2先收到区块B,这就会造成节点1和节点2的区块链产生差异。

为了解决这个问题,确定哪个区块应该被添加到区块链中,P2P网络需要对此做出判断,这个动作称为确认

当产生分支时,P2P网络的各个节点会选择计算量大(即新区块的链的长度)的分支继续工作,从而抑制区块链继续产生分支。

假如下图中同时新增区块3与区块3a,但是在区块3的基础上已经新产生了3个区块,而区块3a的基础上只产生了1个区块,则区块3有效区块3a无效。

比特币系统假设善意的矿工拥有的计算资源要大于恶意的矿工所拥有的计算资源,这是比特币系统正常工作的前提。

匿名性

比特币交易是匿名的,这里的匿名指的是在钱包中生成地址时,可以不将该地址与自己真实的姓名、住址、邮箱等个人信息相关联,也没有必要将自己的身份告诉交易对象。

风险一:交易记录会被公开。

但该地址上的交易会公开给全世界所有用户,而且交易记录也会近似永远地留在区块链上。因此,通常用户不会用同一个地址反复进行交易。

风险二:无法确保交易对象保密

既然产生了交易,那就避免不了公开部分信息,比如实体商品需要公开接收地址、虚拟商品需要公开邮箱等。所以这就产生了隐患,因为无法保证交易的另一方进行保密。

风险三:IP会被记录

并且由于P2P网络的性质,决定了某条交易所对应的节点IP是需要被记录的,这也会产生风险。

信任问题

比特币不存在管理它的国家和中央银行,那么能否信任比特币呢?

能否信任分为三个方面:

  1. 信任使用比特币进行交易的对象。
  2. 信任比特币交易所。
  3. 信任比特币系统。

“信任使用比特币进行交易的对象”等同于信任使用现金或网络支付的对象,更取决于是否相信在向对方支付比特币之后能够收到商品。

“信任比特币交易所”等同于信任存款的银行。即使比特币系统可靠,但是交易所也有可能被盗或参与诈骗。

“信任比特币系统”相当于信任比特币所使用的密码技术以及用于实现这些密码技术的钱包等软件。

比特币系统是基于世界上广泛使用的密码技术以公开的方式设计的,其中并不包含任何隐蔽式安全的要素。因此比特币系统本身是可信的。

总结

比特币是一种基于P2P网络的支付结算系统,在通过公钥生成的地址之间进行交易

比特币交易的合法性通过发送者用私钥进行数字签名来证明

所有的交易记录都保存在公开的区块链中,任何人都可以对其中的记录进行验证

使用单向散列函数使得对区块链的篡改变得非常困难。

通过工作量证明防止伪造和区块链产生分支。

为了添加新区块,矿工需要计算出前面若干个比特为0的符合条件的散列值(挖矿)。如果成功添加新区块,矿工将得到一定数量的比特币作为奖励。

总结

防御必须天衣无缝,攻击只需攻破一点。

信息安全在于流程而非产品。

拒绝服务服务攻击(Denial of Service Attack,DoS攻击)指的是当安全性高的服务器瘫痪时,用户往往会自发转移到安全性较低的服务(此时可以进行窃听等攻击)。