1.数字签名的原理
在日常生活中,签名的意义就是签完你的名后,别人可以知道这件事是你做的,而由于每个人笔迹不同,你也无法否认这个名字是你签的。同真实的签名一样,数字签名也是用来证明某条信息是本人发的,而且本人不可抵赖,他人不可伪造。
通常是用非对称加密(RSA)实现数字签名,分为以下几个步骤:
1.计算消息的摘要M
2.发送方用自己的私钥d对M进行加密,得到S(这里叫作签名,因为M不是一个需要加密的信息,加密的目的是签名),随消息一起发出
3.消息发送之后,接收方对消息计算摘要M,再用发送方的公钥对S解密de’da,如果S==M,则说明是发送方发的,由于其他人不知道d的值,所以其他人无法仿造这个加密,而只有发送方知道d,他也无法否认这条信息是他发的
2.先加密还是先签名?
在上面这个过程中,如果在传输过程,发送方想要对M加密,只让接收方知道这个信息,那他就要对M用接收方的公钥加密,那是先签名还是先加密嘞?
1.假设先加密再签名
这时候中间人出现了,他截取到这个信息,用发送方的公钥解密后,得到消息摘要,这时候,中间人就可以用自己的私钥对这个信息再重新签名了啊!这就是中间人攻击,接收方收到的消息是正确的,但是他却无法判断消息的发送者是谁。
2.假设先签名再加密
显然更安全,只有接收方能得知这个签名后的消息摘要M2,可以保证不会被篡改。
3.应用
1.网站认证使用数字签名
我们访问csdn网站,那怎么知道这个网站是不是真的是csdn呢?
就是使用数字签名了,csdn将自己的公钥公开出去,并声明只有自己持有私钥,那用户就可以用公钥对签名解密,比对是否与摘要相同,来判断该网站是否为真正的csdn
2.保证数据完整性
软件厂商为了保证自己代码不被他人更改,会对数据计算摘要后签名。在运行时先检查是否解密后的S与当前数据的摘要相同,如果代码或数据被篡改过,那么解密后的签名显然不会与当前摘要相等。同时,其他人不知道我们的私钥,也无法修改后重新签名。
3.比特币
比特币是一种完全匿名的数字货币,它的身份认证是基于ECDSA。比特币的账户地址就是对公钥计算摘要得到的,向全世界公布。而确认你是账户拥有者的唯一办法就是看你有没有账户对应的私钥。对于比特币中的任意一个交易记录,只有当其中付款方的签名是有效的,它才是有效的。如果账户私钥丢失,那么你将永远地失去里面的钱(相当于银行卡丢了,没法跟别人再交易了);一旦被黑客盗取,里面的钱就完全归黑客所有(黑客可以用私钥签名,交易,相当于黑客仿造你的笔迹跟别人签合同)。
实际上不止rsa一种方法实现数字签名,非对称加密中还有DSA(基于离散对数问题),ECDSA(DSA的一个变种,基于椭圆曲线上的离散对数问题)也可用于签名,但过程较rsa更为复杂,不作讨论