听说这玩意可以防止否认 —— 数字签名


单向散列函数计算出 MAC 然后将消息和 MAC 封装后拿去警察局报警。

  • 小艾:小杨发给我的诈骗消息骗了我的钱。
  • 小杨:我没有发过这条消息。
  • 小艾:你怎么证明不是你发的。
  • 小杨:你怎么证明是我发的。
  • 警察:到底是谁骗了谁?

消息认证码(MAC) 的缺点就是无法防止否认。因为发送方和接收方可以计算出同样的 MAC 值,所以无法判断这个 MAC 值到底是由谁来计算出来的。
??这个问题的本质在于双方使用同样的密钥生成同样 MAC 值,所以解决这个问题的办法就是让发送者和接收者使用不同的密钥。要求使用不同密钥,很容易想到非对称加密中的公钥与私钥。
??发送方发送消息的时候使用私钥对消息进行签名,接收方接收消息的时候使用公钥对签名进行验证即可确定发送者身份。因为签名只能由发送者的私钥完成,所以这个签名一定是由发送者签发的,这样就没有否认的问题了,这就是数字签名(Digital Signature)。

非对称加密中的公钥和私钥。
??非对称加密中使用公钥加密、私钥解密,数字签名中使用私钥签名、公钥验签,数字签名其实就是公钥密码的反向应用。

公钥私钥
非对称加密算法加密消息解密消息
数字签名验签签名

单向散列函数对消息计算出一个 hash 值,然后对这个 hash 值进行签名,这样既可以对消息签名又节省了时间。

  • 发送者 A 用单向散列函数对消息 M 计算 hash 值 H。
  • A 用自己的私钥对 H 进行签名 S。
  • A 将消息 M 和签名 S 发给接收者 B。
  • B 用 A 的公钥对签名 S 进行解密得到 H。
  • B 使用单向散列函数对收到的消息 M 计算得到 hash 值 H1,将 H 和 H1 进行比对,两者一致则验签成功,否则失败。

消息认证码(MAC) 可以防篡改和仿伪装,但是无法防否认。
  • 使用数字签名可以防篡改、防伪装、防否认。
  • 但是如果验证签名的公钥不是和签名的私钥配对的呢?
    ??这样就会导致验签失败,这里我们就需要一个可信任的机构来为我们颁发可信任的公钥,这就需要用到证书了。