Day25:安全性和演算法-讯息监别码(Message Authentication Code)

讯息监别码(Message Authentication Code)

讯息监别码(Message Authentication Code,MAC),能够实现「身份监别」、「检查讯息完整性」两种功能的机制。即使是密文,也可能在传输时遭到窜改,解密成不同的内容产生误会,讯息监别码就是为了避免这种情况发生。
MAC可以想像成由金钥和密文排列组合成字串「杂凑码」。MAC的制作方式有好几种,包括「HMAC」、「OMAC」、「CMAC」,现在多半使用「HMAC」。

  • HMAC:杂凑讯息监别码(hash-based MAC)
  • OMAC:单金钥讯息监别码(one-key MAC)
  • CMAC:加密讯息监别码(cipher-based MAC)

MAC缺点是A和B都能对讯息加密,计算MAC,也就是说,无法证明制作原始讯息的是A还是B,因此若其中一方不怀好意,可以在传出讯息後,主张是对方捏照的信息,由於制作者和验证者都拥有MAC,因此无法判断是谁做成MAC,这类诡计可以用「数位签章」来防范。

HMAC

由於MAC本身存在的安全隐患,HMAC将「key」和讯息再hash,避免反推的情况,会在hash时往里面加salt,增加复杂度。前几天提到的加密演算法,不论是哪种,都摆脱不了三种组合:key + message、message + key、key +message + key,因此我们需要更高强度的HMAC。

下列影片清楚讲解HMAC架构:

HMAC的优点其中一个最重要的他可以被嵌入在不同的杂凑演算法中,也是因为安全性以及弹性高,HMAC目前广泛地使用。

在Python中使用HMAC

import hmac
from hashlib import sha1
message = b'Hello, world!'
key = b'secret'
h = hmac.new(key, message, sha1)
print(h.hexdigest())

参考资料:用于消息验证的hash算法HMAC


数位签章(Digital Signature)

数位签章是在能够实现「身份监别」和「检查讯息完整性」两种功能的讯息监别码里,加入也确保具有「不可抵赖性」(non-repudiation)的机制。讯息监别码机制使用共同金钥,造成拥有金钥的收讯者也可能是讯息的传送者;另一方面,数位签章的机制是利用只有传送者才能制作的称为「数位签章」的数据,所以可以确定讯息的制作者。

数位签章的具体制作方式:参考公开金钥密码系统的步骤

数位签章虽然具备「身份监别」、「检查讯息完整性」、「不可抵赖性」的功能,但仍有一个问题:

  • B以为数位签章是由A制作,但由可能为不怀好意的X伪装成A,问题的根本原因是,用公开金钥密码系统时,无法得知公开金钥的拥有者身份,收到的公开金钥里,并未包含任何可表示制作者的资讯,有可能是伪装成A的其他人所制作的公开金钥,此问题可用「数位凭证」机制来解决。

数位凭证(Digital Certificate)

公开金钥密码系统和数位签章的机制,无法确保公开金钥确实为通讯对象所拥有,因此,如果不怀好意的第三人调换公开金钥,收讯者无法察觉,需要利用「数位凭证」解决此问题。

步骤:

  1. A拥有成对的公开金钥Pa和私密金钥Sa,打算把公开金钥Pa传送给B
  2. 首先,A要向凭证机构(certification authority,CA)申请发行凭证,证明公开金钥Pa是自己的
  3. 凭证机构本身具备准备好的公开金钥Pc和私密金钥Sc
  4. A把公开金钥Pa和包含电子邮件地址的个人资讯传送给凭证机构
  5. 凭证机构确认传来的资讯是否为A本人所有,确认完毕後,用凭证机构的私密金钥Sc将A的数据制作成数位签章
  6. 凭证机构将制作完成的数位签章和数据整合成一个电子档,并且传送给A,取代公开金钥
  7. A将数位凭证传送给B,B确认收到的凭证中电子邮件地址是A的,接着B取得凭证机构的公开金钥
  8. B验证凭证内的签章是否为凭证机构所发行。凭证的签章只能用凭证机构的公开金钥Pc来验证。换言之,验证无误的话,就能确认该凭证确实是由凭证机构发行
  9. 确认完凭证後,从凭证中取出A的公开金钥Pa,这样就完成A传给B的步骤

凭证机构可以由任何人或任何公司发行,B取得的公开金钥Pc,真的是凭证机构制作的吗?

事实上凭证机构的公开金钥Pc,也会议数位凭证的方式提供,因此,这个凭证机构的凭证发行者,就是更上层的凭证机构,上层凭证机构制作下层凭证机构的凭证。
位在最上层的凭证机构称为「根凭证机构」(root CA),自己的真实性由自己来证明,而root CA用来证明自己的凭证,称为「根凭证」(root certifficate)。根凭证机构的组织本身若不值得信来,就不会有人使用,所以大多为大企业或政府机关等已经获得社会信赖的组织。

「服务器凭证」(server certificate):同样是由凭证机构发行,个人的凭证与电子邮件地址绑在一起,服务器凭证则是与网域连在一起。换言之,透过凭证可以确认管理这个网站网域的组织,以及管理存放网站内容的服务器组织,两者是同一个。


<<:  Day 11 已故用户的隐私设计

>>:  [Day10] 注册API – views

(Hard) 32. Longest Valid Parentheses

Given a string containing just the characters '(' ...

【课程推荐】2021/3/6~3/7 ISTQB Certified Tester 软件测试工程师(Foundation Level)国际认证班

课程目标 本课程定位为「软件测试入门砖」,课程规划依据「2018 ISTQB Foundation ...

资料控制者(data controller)

-资料和系统所有者 将“资料所有者“(data owner)和“资料控制者”(data contr...

二、教你怎麽看source code,找到核心程序码 ep.19:把tfrecord parse完了,接着做了哪些preprocess? 3

文章说明 文章分段 文章说明 deeplab的简单介绍、於我的意义 tensorflow的程序码特色...

裸机Hyperviser大众化原因

今天来探讨裸机Hyperviser在近几年朝大众化的原因 摆脱固有平台 受够了各大云端运算服务的绑手...