我们都知道区块链是公开透明的,那么有人会有这样的疑问,我们什么时候和谁交易了多少钱,都会记在大家的账本上,岂不是没有了隐私?其实区块链对于我们的身份信息是有所保护的,在发送和验证交易的时候,并不需要我们的真实身份(文末解答关于匿名性的问题,下图对于比特币匿名性简直诠释得淋漓尽致,相信看过千与千寻的人都知道这个无脸男,阿深第一眼看到此图差点没笑喷出来)。但如果是匿名的,系统怎么能确定是我发送的交易呢?万一别人伪装成我的身份呢?又或者篡改了我的交易信息呢?不同的区块链系统对于这方面所做的措施又不尽相同,具体又是怎么做的,这就是今天的主题--数字签名。
1.概念
数字签名(又称公钥数字签名、电子签章)是一种类似写在纸上的普通的物理签名,使用了公钥加密领域的技术实现,用于鉴别数字信息的方法。就是只有信息的发送者才能产生的别人无法伪造的一段数字串,这段数字串同时也是对信息的发送者发送信息真实性的一个有效证明,主要用于数据更改的签名者身份识别以及抗抵赖。数字签名是非对称密钥加密技术与数字摘要技术的应用。
这里再科普一下非对称加密技术,非对称加密算法是一种密钥的保密方法,需要两个密钥:公钥和私钥。公钥与私钥是一对,如果用公钥对数据进行加密,只有用对应的私钥才能解密,从而获取对应的数据价值;如果用私钥对数据进行签名,那么只有用对应的公钥才能验证签名,验证信息的发出者是私钥持有者。因为加密和解密使用的是两个不同的密钥,所以叫非对称加密。至于数字摘要技术,请看阿深的上一篇文章“核心技术之merkle树”。
2.原理
发送报文时,发送者用一个哈希函数从报文文本中生成摘要信息,将摘要信息用发送者的私钥加密,加密后的摘要信息将作为报文的数字签名与报文一起发送给接收者。接收者先用与发送者一样的哈希函数对收到的原文计算,产生一个摘要信息1,然后用发送者的公钥来解密被加密的数字签名(摘要信息)得到解密后的摘要信息2,这两个摘要信息(1和2)如果相同,那么接收者就能确认该数字签名是发送者的。也说明收到的信息是完整的,在传输过程中没有被修改。
下图中A是发送者,B是接收者。
举个例子,小明发起了一笔比特币转账,系统先将该交易进行数字摘要生成,然后用小明的私钥对摘要进行加密,形成数字签名。完成后,系统将原文(交易信息)与数字签名一起广播给矿工,矿工用小明的公钥进行验证,如果验证成功,则说明该交易确实是小明发出的,且信息未被更改。在这个过程中,小明身为用户仅仅做了转账时输入了私钥就好了。
总结一下数字签名就是发送者用私钥进行签名,接收者就只能用发送者的公钥进行验证该信息的发送者就是私钥的持有者。
3.特点
(1)数字签名需要和具体的数字文档绑定,就好比现实中签名应该和纸质媒介绑定;(2)数字签名不可伪造;(3)能证明消息确实是由信息发送方签名并发出来的,并且确定消息的完整性。
最后,回答一下最开始关于匿名性的问题,还是以比特币为例。首先我们购买比特币的时候,都有一个钱包地址,这个地址也就是我们的数字身份,掩盖了现实中的身份,验证身份就用上文中的数字签名。
但是发送和接收比特币就像作者用笔名发表作品一样,如果一个作者的化名和他们的身份联系在一起,他们曾经写下的任何东西都会与他们联系在一起。对于比特币来说,涉及你钱包地址的每一项交易都永久、公开的保存在该区块链中,任何人都能看到。举个例子:某个用户在线下进行消费,并通过比特币进行支付,那么商家事实上建立了对用户的线上(比特币地址)线下(用户身份)关联。
如果你在每个交易所的地址能够和你的身份关联起来,那么就能够知道每一笔和你有关的交易数据,不仅知道你的所有,还可能会有攻击你隐私数据的不法分子。这份身份情报可能会来源于网络统计信息、流量监视或者谷歌搜索,这些数据会成为你的背景知识,攻击者可以利用连续发布的大量数据来挖掘出关联规则作为背景知识来推测你的敏感信息,对个人隐私进行攻击,这就是背景知识攻击,这都是有一定可能性的,就看他掌握你的背景知识的多与少了。
比特币系统还在开发中,也存在各种机制来保护。还有就是人类钻空子找方法的本领一直是所有物种中最强的,现在已有很多方法来避免以上不安全的攻击,例如每笔交易换个地址、现金购买、交易所随机地址发送给你提币,包括针对这种现象出现的很多服务,具体不细说了。要提的是门罗币,门罗币在数字签名这方面用了一次性的环签名技术。主要就是将发送者的私钥和任意多个其他成员的公钥(也包括混合了自己公钥)为发送者的原文生成签名,接收者根据环签名和原文验证签名是否为环中成员所签。其中成员无法冒充真实签名者的签名。这样攻击者无法确定签名是由环中哪个成员生成的,确保了交易的隐蔽性。