消息认证

单向散列函数、消息认证码、数字签名、证书

消息被篡改

  • A向B转账1万元
  • 消息在传递的过程中被篡改成了转账100万

如果这条消息”A向B转账1万元”经过函数计算后,得出一个值,暂称为”散列值”,把”散列值”发送给银行。银行也通过函数计算得出一个”散列值”,判断两个散列值是否相等,如果相等则认为消息没有被篡改,如果不相等则消息被篡改。这种函数计算一般就是单向散列函数。

单向散列函数 防止信息被篡改 保证消息完整性

  • 根据任意长度的消息计算出固定长度的散列值
  • 能够快速计算出散列值
  • 消息不同散列值也不同,即使改1比特的数据,散列值完全不一样
  • 具有单向性(不可逆)

单向散列函数能够识别篡改,但无法辨别伪装。

消息被伪装

  • A向B转账1万元,这个消息是A用户发出的吗?还是攻击者伪装成A发送的?

如果A有密钥,密钥+消息,这两个一起通过单向散列函数计算;银行得到这个消息后,也用密钥+消息,两个一起单向散列函数值计算。 A发送的散列值与B计算得到的散列值是否相同。 其中A和银行使用的密钥是一样的,该密钥又称为共享密钥。 共享密钥只有A和银行知道,这样就可以辨别出伪装了。

消息认证码

  • 消息认证码是一种与密钥相关联的单向散列函数。
  • 密钥配送问题,需要使用公钥密码、Diffie-Hellman密钥交换、密钥分配中心等。

消息认证码无法解决的问题

现在国家要对银行每笔交易进行监控,即第三方。
那么第三方也要有共享密钥,如果银行冒充用户A,向第三方发送消息了,用户A的钱就少了。实际上用户A无缘无故钱就少了。第三方对你说:我们收到你的转账请求了,银行死不要脸对你说:我们收到你的请求,才会给第三方(国家)说的。

第三方证明

  • 用户A、银行、国家(第三方)。银行直接扣除用户A的钱,银行模拟用户A向国家发送了消息。实际上用户A是无辜的呀,投诉无门,银行咬死说就是用户A发的消息。

中间的问题出现在密钥是共享的,用户、银行、国家都有该密钥。如果用户有密钥A,银行和国家有同一个密钥B,密钥B能对密钥A进行验证,那么就不会出现这样的问题了。

数字签名

  • 数字签名包括生成消息签名&验证数字签名
  • 签名密钥只能签名的人持有(可理解为用户A),验证密钥的人任何人都可持有(理解为银行、国家)

使用非对称加密,但是与正常的非对称加密不同。
正常情况下使用的非对称加密: (多个)发送者使用公钥加密,接受者使用私钥解密。
数字签名使用的非对称加密:发送者使用私钥加密,(多个)接受者使用公钥解密。

数字签名无法解决的问题

要正确使用数字签名,前提是用于验证签名的公钥必须属于真正的发送者。(中间人攻击)

数字签名是用来识别消息篡改、伪装以及否认的,但是为此我们又必须得到真正的公钥才行。 矛盾了,死循环。

发送真正的公钥 未被篡改的公钥

  • 发送者发送公钥、接受者接受公钥,如何保证接受者收到的是正确的公钥,未被篡改过的。数字签名就是解决消息认证的问题,但是需要接受者收到的是真正的公钥。死循环了吧。

公钥证书有认证机构施加数字签名,只要是公钥证书,我们就可以知道认证机构认定该公钥是发送者的、是正确的。

认证机构:能够认定“公钥确实属于此人”并能够生成数字签名的个人或者组织。

证书

  1. 消息接收者receiver 生成密钥对 (公钥A,私钥A’
  2. 消息接收者receiver认证机构注册自己的公钥 A
  3. 认证机构用自己的私钥B’对公钥A进行数字签名,就是证书
  4. 消息发送者sender 得到消息接收者receiver的公钥A+数字签名
  5. 消息发送者sender认证结构的公钥B,验证数字签名是否合法。
  6. 消息发送者sender接收者receiver的公钥A 加密消息
  7. 消息接收者receiver用私钥A’,进行解密
xpisme wechat
微信号