2.8 数字签名
通过散列函数可以确保数据内容的完整性,但这还远远不够。此外,还需要确保数据来源的可认证(鉴别)性和数据发送行为的不可否认性。完整性、认证性和不可否认性,正是数字签名的主要特征。数字签名针对以数字形式存储的消息进行处理,产生一种带有操作者身份信息的编码。执行数字签名的实体称为签名者,签名过程中所使用的算法称为签名算法(Signature Algorithm),签名操作中生成的编码称为签名者对该消息的数字签名。发送者通过网络将消息连同其数字签名一起发送给接收者。接收者在得到该消息及其数字签名后,可以通过一个算法来验证签名的真伪以及识别相应的签名者。这一过程称为验证过程,其过程中使用的算法称为验证算法(Verification Algorithm),执行验证的实体称为验证者。数字签名离不开非对称密码体制,签名算法受私钥控制,且由签名者保密;验证算法受公钥控制,且对外公开。RSA算法则既是最为常用的非对称加密算法,也是最为常用的签名算法。DSA算法是典型的数字签名算法,虽然本身属于非对称加密算法不具备数据加密与解密的功能。
数字签名满足以下三个基本要求:
❑签名者任何时候多无法否认自己曾经签发的数字签名。
❑信息接收者能够验证和确认收到的数字签名,但任何人无法伪造信息发送者的数字签名。
❑当收发双方对数字签名的真伪产生争议时,通过仲裁机构(可信赖的第三方)进行仲裁。
数字签名认证流程如图2-13所示。在这里提请大家注意:私钥用于签名,公钥用于验证。签名操作只能由私钥完成,验证操作只能有公钥完成;公钥与私钥成对出现,用公钥加密的消息只能用私钥解密,用私钥加密的消息只能用公钥解密。
那么,数字签名认证是怎样一个流程呢?我们暂定甲方拥有私钥,并且甲方将公钥发布给乙方;当甲方作为消息的发送方时,甲方使用私钥对消息做签名处理,然后将消息加密后连同数字签名发送给乙方。乙方使用已获得的公钥对接收到的加密消息做解密处理,然后使用公钥及数字签名对原始消息做验证处理。
图 2-13 数字签名认证流程
当然,我们可以对消息先加密,然后对加密后的消息做签名处理,这样乙方获得消息后,先做验证处理,如果验证通过则对消息解密。反之,验证失败则抛弃消息。这样做显然可以提高系统的处理速度,但即便如此,作者仍建议大家对消息先做签名,再做加密处理。加密与签名都应该只针对原始消息(明文)做处理。加密是为了确保消息在传送过程中避免被破解,签名是为了确保消息的有效性。消息本身可能就是一个可执行的文件,消息的接收方通过对消息的验证来判别该文件是否有权执行,而这个文件本身是不需要加密的。
由于签名不可伪造,甲方不能否认自己已发送的消息,而乙方可验证消息的来源以及消息是否完整。数字签名可提供OSI参考模型五类安全服务中的三种服务:认证(鉴别)服务、抗否认服务和数据完整性服务。正因如此,数字签名成为公钥基础设施以及许多网络安全机制的基础。
在上述认证过程的描述中,似乎大家有这样一个疑问:当乙方作为发送方,通过公钥将消息加密后发送给甲方时,由于算法、公钥公开,任何一个已获得公钥的窃听者都可以截获乙方发送的消息,替换成自己的消息发送给甲方,而甲方无法辨别消息是否来源于乙方。也就是说,上述的认证方式是单向的,属于单向认证。如果有两套公私钥,甲乙两方都对数据做签名及验证就可以避免这一问题。没错,这种认证方式正是双向认证。以网银交易为例,一般的网银交易使用的都是单向认证方式,无法验证使用者的身份;而要求较高的网银交易则都是双向认证方式,交易双方身份都可以得到验证。