数字签名

1 1月

数字签名(digital signature)相当于“盖章”,用于防“否认”。发送者持有私钥(签名密钥)签名,接收者持有公钥(验证密钥)验证签名。

加密用于保护信息的”隐私性“,单向散列函数能防止信息被”篡改“,消息认证码保证了信息的真实性,不是骗子发的。但这还不够,所以我们还需要数字签名,相当于“盖章,签名”,防止发送者否认抵赖,或接收者无中生有伪造消息。

数字签名需要发送者和接收者双方使用不同的密钥:

  • 发送者发送消息时,用私钥生成一个“签名”
  • 接收者接收消息时,用公钥对发送者的“签名”进行验证,即验证下这个“签名”是通过发送者私钥生成的

这就是数字签名,有两种行为:

  • 生成消息签名:发送者用签名密钥和消息内容计算出签名,意味着“我认可这条消息中的内容”
  • 验证消息签名:使用验证密钥来验证消息签名,可以由接收者完成,也可以由第三方验证机构完成

数字签名和公钥密码很相似,就是将公钥密码“反过来”。公钥密码是公钥加密,私钥解密。数字签名是私钥(签名密钥)加密,公钥(验证密钥)解密。数字签名的算法常使用RSA算法。

发送者生成私钥(签名密钥)和公钥(验证密钥)对,两者要有数学关系,否则无法配对。发送者用私钥(签名密钥)对哈希值进行数加密(注意,不是对整个消息内容加密,那样太耗时了)生成数字签名,并将消息和数字签名发送给接收者。接收者用公钥(验证密钥)对数字签名解密,解密出的哈希值,与本地用单向哈希函数生成的哈希值进行比对。

数字签名签过后,可以被重复使用呢?例如攻击者伪造一段信息,下面贴个数字签名?不行,因为上面流程中数字签名是基于消息内容的哈希值的,不同消息内容生成的数字签名是不同的,所以攻击者就算伪造一段信息,使用旧的数字签名,签名是无法被接收者验证通过的。

PS:因为MAC地址不会经常变,所以选择用对称密钥来生成。而数字签名每条消息都要签名,所以选择用消息的hash值进行签名。

因为只有持有私钥的发送者能签名,所以数字签名本身不需要保密,可以直接发送,即使被攻击者截获用公钥解密出签名也没问题,就好像现实生活中的签名,人人都能看,但只有当事人才能签出这种笔迹。

消息认证码的MAC值是基于共享密钥生成的,因此双方都能计算出MAC值,发送者可以抵赖:“这个MAC值不是我计算的,是接收者计算出来伪造的”。但数字签名私钥(签名密钥)只有发送者才有,这样发送者就无法抵赖了。

数字签名在现实中被广泛应用:

  • Android系统是无法安装没有数字签名的app的
  • SSL/TLS认证服务器身份是否合法时会使用服务器证书,它就是加上数字签名的服务器公钥。服务器对客户端认证也会使用客户端证书。
  • 现实中经常出现明文公示,下面配上数字签名,以证明这个公示确实出自官方结构:

数字签名会遇到中间人攻击(man-in-the-middle attack)的问题,攻击者并不需要破解数字签名,而是伪造成对方进行攻击,防止中间人攻击需要对公钥使用证书。

发表评论

邮箱地址不会被公开。 必填项已用*标注