图解密码技术学习-第九章 数字签名

数字签名介绍

碰到的问题

  • 数字通信时我们碰到了几个问题:防篡改确认发送者防否认
  • 消息认证码只能解决防篡改确认发送者,却无法解决**防否认。
  • 主要原因是消息认证码采取的发送者和接收者共享密钥的方式,这样如果为了防止否认需要引入第三方认证时,第三方是无法知晓到底计算的MAC是属于谁的。

数字签名解决问题原理

  • 简单的说使用了类似公钥密码的技术来解决防止否认的问题。
  • 公钥密码是发送方使用接收方的公钥加密,而接收方使用自己的私钥解密。
    数字签名正好相反,发送方使用自己的私钥加密,而其他任何人都使用公钥进行解密。
  • 由于是使用公钥进行解密,也就是说任何人都可以进行解密,毕竟签名的作用是用来验证的。既然是任何人,意味着第三方也可以做验证了。
    由于是用自己的私钥进行加密,所以无论如何是没法否认消息不是自己发的了,因为私钥只有自己知道。

数字签名的使用方法

数字签名的流程

虽然可以直接对消息进行加密,但是一般应该是对消息的散列值进行加密。

  1. 发送者生成私钥和公钥,将公钥发送给接收者
  2. 发送者将消息生成散列值,针对散列值用私钥进行加密,并将加密后的结果发送给接收者
  3. 接收者接收到消息后,生成散列值
  4. 接收到加密后的散列值后,使用公钥进行解密得到散列值
  5. 接收者将自己生成的散列值 和 解密后的散列值进行比对,如果相同则验证成功。

由于使用了散列值,所以可以防篡改。
由于使用了私钥加密,所以可以确认发送者,同时防止否认。

对数字签名的疑问

数字签名的疑问书中有很多点,这里只摘取觉得必要的问题。

  • **删除签名也无法"作废合同"吗
    • 疑问
      如果是纸质的借据,撕毁原件就可以作废。但是数字签名是计算机文件,即使删除也可能有其他的拷贝,那么无法作废的签名是不是非常不方便?
    • 解答
      确实带有数字签名的借据不能像纸件删除原件就可以作废,因为数字签名文件压根就不存在原件的概念。解决的办法是:
      重新创建一份相当于收据的文件加上数字签名即可。
      或者在消息中声明该消息的有效期并加上数字签名,公钥的证书就属于这种情况。
  • 数字签名真的能够代替签名吗
    • 疑问
      纸质借据上如果不签名盖章的话,总是觉得不太放心。数字签名真的能够有效代替现实世界中的签名和盖章吗?
    • 解答
      数字签名没有办法完全替代手动签名,很大的原因在于签订合同、进行认证这样的行为是一种社会性的行为。
      美国于2000年颁布了E-SIGN法案,日本于2001年颁布了电子签名及其认证业务的相关法律。这些法律为电子手段实现的签名和手写的签名和盖章同等处理提供了法律基础。
      但是实际过程中仍旧会有很多围绕数字签名的诉讼。毕竟电脑可能中毒,也有可能不是这个软件签名等等因素在里面。

数字签名的实际应用

  • 安全信息公告
    信息安全公告是发布官方漏洞的,但是这个消息是需要看的人判断真伪、判断是否被篡改的。所以在消息后加上数字签名即可,消息本身无需加密,因为本来就是给别人看的。
  • 软件下载
    为了防止软件被篡改,导致使用者用了盗版软件,所以软件发布者需要加上数字签名,以帮助软件使用者做校验。
  • 公钥证书
    为了保证自己使用的公钥是合法的公钥,所以需要对公钥进行数字签名加以验证。这个就是公钥证书
  • SSL/TLS
    SSL/TLS在认证服务器身份是否合法时会使用服务器证书,它就是加上了数字签名的服务器公钥。对客户端认证也会使用客户端证书。

通过RSA实现数字签名

RSA在公钥加密时已经详细介绍了,所以细节不再介绍。
一开始我的疑问是为什么又是RSA呢?数字签名和公钥加密不是反过来的吗?难道不需要新的算法?
其实RSA只是用来生成公私钥对的,至于哪个用于加密和哪个用于解密,就看是用于公钥加密还是用于数字签名了。

对数字签名的攻击

  • 中间人攻击
    中间人攻击的实质是截获了接收方发出的公钥或者私钥,并将自己的公钥或者私钥发送给另外一方。所以针对公钥密码的中间人攻击,针对数字签名同样有效。
    具体解决的办法就是涉及公钥密码的软件都显示公钥的散列值,也就是指纹。比对指纹的正确性就能确认公钥是不是对方的公钥了。
  • 对单向散列函数的攻击
  • 利用数字签名攻击公钥密码
    • 这是一个巧妙的攻击方式。
      • A与B进行通信,A是用B的公钥进行加密的,B用私钥进行解密。
      • 数字签名过程中,公钥却是用来解密的,私钥是用来加密的。
      • 而且 公钥密码中的私钥解密 和 数字签名中的私钥加密是相同的公式。
      • 所以,攻击者可以保存A用公钥加密后的消息。然后发邮件给B说需要做一个数字签名实验,需要B对消息进行加密。
      • B一旦使用自己的私钥对所谓的签名消息进行加密,实际上就是对A发送的消息进行解密。这就完成了攻击。
    • 防御的办法
      • 不要用消息直接加密,使用散列值加密
      • 公钥密码和数字签名最好不要使用相同的密钥对
      • 绝对不要对意思不清楚的消息进行签名

各种密码技术对比

消息认证码和数字签名

关键区别:

  • 密钥配送问题:消息认证码存在此问题;数字签名不存在此问题,但是公钥必须有另外的认证(详细见中间人攻击)
  • 认证:消息认证码支持,但是只能在通信双方之间;数字签名支持,并且可以支持第三方认证。
  • 防止否认:消息认证码不支持;数字签名支持。

数字签名无法解决的问题

数字签名可以 防篡改、检验发送者真伪、防否认,这些都是针对消息本身的。
但是在解决消息本身的这些问题时,带入了一个数字签名机制本身的问题,就是公钥持有者的真伪问题(中间人攻击)。
判断公钥是否合法,这就需要使用到证书,而且需要引入第三方来认证。

你可能感兴趣的:(图解密码技术学习-第九章 数字签名)