在一个完美的世界上,没有人需要用到密码。每个人都高度自律,心无邪念;每件快递都能不经拦截准确送达收件人;而每个寄件者都是值得信赖的。但是我们并不在这样完美的世界中生存。过去的数十年间,密码学已经发展到不仅可以通过加密来保障机密性,还可以确保消息的完整性、身份验证,以及不可否认性——所有的一切都是为了保证消息私密、真实和可靠。
假如您的系统已经实现了强有效的密码策略,这可能会使您认为不再需要通过生物特征来验证就是用户本人。为了理解为什么验明用户正身在密码学中如此重要,让我们依次对照来看密码学中几种方法的成功和不足之处。由此,作为诸如银行系统或医疗系统等高端服务的提供者,可以了解为什么您可能需要在密码策略的基础上进一步实现基于生物特征的身份验证功能。
仅凭加密无法防御某些特定类型的攻击
您可以把加密比作一个函数,比如 E,这个函数接收两个参数,消息 m 和密钥 k,并由此生成密文 c。生活中人们常常把这个密文当作加密,但事实上加密指的是能够生成攻击者无法读取的加扰信息的算法,而最终的加扰信息就是密文。
c = E(m,k)
只要密钥 k 足够长,当您仅知道 m 或 c 部分内容时,几乎不可能得出密钥 k。但是,攻击者无需解密消息即可对其进行篡改,攻击者也许可以编辑密文、删除密文,或者以重放的方式重新发送一条包含密文的消息。
并不是所有的攻击者都想要盗窃您的数据;他们可能只想给您带来不便。试想有一个攻击者,他只是重放了您向电脑城付款 $2,000 购买笔记本的加密交易。假设他是与该电脑城没有任何联系的攻击者,所以他什么也没有偷走。您固然可以通过一些申诉手段向店家要回退款,但既蒙受了时间的损失又没了好心情。更糟糕的是,某些精于此道的攻击者也许会将电脑城的银行账户替换为其他银行账户——这一切完全不需要解密您传输的密文。
当然,刚才的这些都只是接触了其中的皮毛。针对纯加密方案的攻击有许多更知名的案例。即使您的加密算法充分防范了已知的攻击手段,但仍可能会有不足。简单说来,您没办法永远保证消息的私密性。甚至是在最佳密码学策略的加持下,当下技术的发展速度只能让您的消息在 30 年内保持私密,或许运气好的话,能有 50 年。因此,仅凭加密是无法与破坏消息完整性的攻击者相抗衡的。您还需要用上身份验证手段,也就是下个小节要探讨的问题。
通过消息身份认证保证消息不被篡改
在一些敏感场合中,欺骗性质的消息误传会造成破坏性影响。这个重要的事实启发安全工程师们创造了消息认证码 (Message Authentication Code,简称 MAC 或 HMAC)。如果发信人在发送消息的同时还传输了 MAC,那么攻击者就无法再修改内容并假装这就是原始消息。同时攻击者也无法重放已经发送过的消息。攻击者能做到的最多就是删除发送的消息造成通讯失败。
MAC 是什么?MAC a 与通过消息和密钥计算得到的密文相似。本质上,发信人将消息 m 和密钥 k传入函数 h 计算就能生成 MAC 了。随后,发信人同时将消息和 MAC 发送给收信人。
m,a = h(m,k)
MAC 与单条消息并不是唯一对应的,这是由于鸽笼原理导致的,大致意思是如果您的鸽子数量比鸽笼要多,那么某些鸽笼中就不止一只鸽子了。MAC 的长度是预先就决定了的,因此消息的数量会比对应 MAC 的数量要多。但是由于搜索域太大,攻击者想要在不知道密钥的情况下很难猜出修改后的消息对应的 MAC。因此,MAC 能够有效防止消息被修改的原因是只有发件人和目标收件人知道密钥。如果攻击者想要修改发送的消息,那么他必须替换 MAC 以匹配更改。但是在不知道密钥的情况下这几乎是不可能的。由于连续两次计算 m,a = h(m,k) 会生成两个不同的 MAC,消息重放攻击也会随之失效。这是因为在实践中通常还有第三个严格增加的参数 t: 因此公式写作 m,a = h(m,k,t)。由此,MAC 函数能帮助合法的收件人轻松验证是否遭遇了消息重放攻击。
MAC 机制本质上使得攻击者必须破解密钥。由于 MAC 的存在,模仿原始消息不再可行。消息完整性得到根本保障。虽然 MAC 机制非常实用,但在机密性方面它仍然有局限,这也是后面章节要说明的问题。
已签名但未封装
值得注意的是,MAC 只是对消息进行了签名而没有将其封装——也就是没有机密性。攻击者仍然可以读到消息的内容;只不过他们无法轻松篡改内容。但是同时进行签名和封装并不难。我们不再使用 m,a = h(m,kₐ),取而代之的是通过代数替换得到 c,a = h(c,kₐ) ,其中 c 是由 c= E(m,k