数字签名不紧可以实现消息认证码认证和检测窜改功能,还可以预防事后否认问题的发生。
由于在消息认证码中使用的是共享密钥加密,所以持有密钥的收信人也有可能是消息的发送者,这样是无法预防事后否认行为的。
而数字签名是只有发信人才能生成的,因此使用它就可以确定谁是消息发送者。
流程:
假设A要向B发送消息。
在发送前A给消息加上数字签名。数字签名只能由A生成。
B收到消息后,可以确认数字签名确实是由A生成的。
只要发送的消息上有A的数字签名,就能确定消息的发送者是A.
B可以验证数字签名的正确性,但是无法生成数字签名。
数字签名的生成使用的是公开密钥加密。
公开密钥加密,加密使用的是公开密钥,解密使用的是私有密钥。任何人都可以使用公开密钥对数据进行加密,但是只有持有私有密钥的人才能解密数据。
然而,数字签名却是恰恰相反的。
数字签名的生成步骤:
首先:由A准备好需要发送的消息、私有密钥和公开密钥。
由消息的发送者来准备这两个密钥,这一点与公开密钥加密有所不同。
A将公开密钥发送给B.
A使用私有密钥加密消息。加密后的消息就是数字签名。A将消息和签名都发送给了B。
B使用公开密钥对密文(数字签名)解密。
B对解密后的消息进行确认,看它是否和收到的消息一致。
在流程中:
生成的是“只能由持有私钥密钥的A来加密,但只要有公开密钥,谁都可以进行解密”的密文。这个密文作为密码似乎没有任何意义。
但是换一个角度看就会发现,它可以保证这个密文的制作者只能是持有私有密钥的A。
在数字签名中,是将“只能由A来加密的密文”作为“签名”来使用的。
严格来说,也有使用加密运算以外的方法来生成签名。
但是,用私有密钥生成签名、用公开密钥验证建明这一机制是相同的。
在公开密钥加密中,用公开密钥加密的数据都可以用私有密钥还原。
数字签名利用的是用私有密钥加密的数据,用公开密钥解密还原这一性质。
也就是说,即使密钥使用顺序不一样,运行结果都是一样的。
并不是所有的公开密钥加密都具有这个性质。
不过RSA加密算算法是可以的。
能够用A的公开密钥解密的密文,必定是有A生成的。
因此,我们可以利用这个结论来确定消息的发送者是否为A,消息是否被人篡改。
由于B只有公开密钥,无法生成A的签名,所以也预防了时候否认这一问题。
补充:
在实际的应用场景中,公开密钥加密和解密都比较耗时。为了节约运算时间,实际上不会直接对消息进行加密。
而是先求得消息的哈希值,再对哈希值进行加密,然后将其作为签名来使用。
缺陷:
虽然数字签名可以实现“认证”,“检测篡改”,“预防事后否认”三个功能,但是它也有一个缺陷。
那就是,虽然使用数字签名后,B会相信消息的发送者是A,但是实际上也有可能是X冒充了A.
其根本原因在于使用公开密钥加密无法确定公开密钥的制作者是谁。收到的公开密钥是哪个也没有任何制作者的信息。
因此,公开密钥有可能是由某个冒充A的人生成的。
使用数字证书就能解决这个问题。
网友评论