区块链技术之密码学技术之数字签名
数字签名
类似在纸质合同上签名确认合同内容,数字签名用于证实某数字内容的完整性(integrity)和来源(或不可抵赖,non-repudiation)。
一个典型的场景是,A要发给B一个文件(一份信息),B如何获知所得到的文件即为A发出的原始版本?A先对文件进行摘要,然后用自己的私钥进行加密,将文件和加密串都发给B。B收到后文件和加密串,用A的公钥来解密加密串,得到原始的数字摘要,跟对文件进行摘要后的结果进行比对。如果一致,说明该文件确实是A发过来的,并且文件内容没有被修改过。
HMAC
全称是Hash-based Message Authentication Code,即“基于Hash的消息认证码”。基本过程为对某个消息,利用提前共享的对称密钥和Hash算法进行加密处理,得到HMAC值。该HMAC值提供方可以证明自己拥有共享的对称密钥,并且消息自身可以利用HMAC确保未经篡改。
HMAC(K,H,Message)
其中,K为提前共享的对称密钥,H为提前商定的Hash算法(一般为公认的经典算法),Message为要处理的消息内容。如果不知道K和H,则无法根据Message得到准确的HMAC值。
HMAC一般用于证明身份的场景,如A、B提前共享密钥,A发送随机串给B,B对称加密处理后把HMAC值发给A,A收到了自己再重新算一遍,只要相同说明对方确实是B。
HMAC主要问题是需要共享密钥。当密钥可能被多方拥有的场景下,无法证明消息确实来自某人(Non-repudiation)。反之,如果采用非对称加密方式,则可以证明。
盲签名
1983年由David Chaum提出。签名者在无法看到原始内容的前提下对信息进行签名。盲签名主要是为了实现防止追踪(unlinkability),签名者无法将签名内容和结果进行对应。典型的实现包括RSA盲签名。
多重签名
n个持有人中,收集到至少m个(m<n)的签名,即认为合法,这种签名被称为多重签名。其中,n是提供的公钥个数,m是需要匹配公钥的最少的签名个数。
环签名
环签名由Rivest,shamir和Tauman三位密码学家在2001年首次提出。环签名属于一种简化的群签名。签名者首先选定一个临时的签名者集合,集合中包括签名者自身。然后签名者利用自己的私钥和签名集合中其他人的公钥就可以独立的产生签名,而无需他人的帮助。签名者集合中的其他成员可能并不知道自己被包含在其中。