鉴别
对付被动攻击的重要措施是加密,而对付主动攻击中的篡改和伪造则要用鉴别 (authentication) 。
鉴别与授权 (authorization)是不同的概念。授权涉及到的问题是:所进行的过程是否被允许(如是否可以对某文件进行读或写)。
报文鉴别
报文鉴别使得通信的接收方能够验证所收到的报文(发送者和报文内容、发送时间、序列等)的真伪。即鉴别所收到的报文的确是报文的发送者所发送的,而不是其他人伪造的或篡改的。这就包含了端点鉴别和报文完整性的鉴别。
密码散列函数
数字签名就能够实现对报文的鉴别。但这种方法有一个很大的缺点:对较长的报文进行数字签名会使计算机增加非常大的负担,因为这需要进行较多的时间来进行运算。
特点:单向性。
要找到两个不同的报文,它们具有同样的密码散列函数输出,在计算上是不可行的。也就是说,密码散列函数实际上是一种单向函数 (one-way function)。
散列函数的两个特点
- 散列函数的输入长度可以很长,但其输出长度则是固定的,并且较短。散列函数的输出叫做散列值,或更简单些,称为散列。
- 不同的散列值肯定对应于不同的输入,但不同的输入却可能得出相同的散列值。这就是说,散列函数的输入和输出并非一一对应的,而是多对一的。
MD5
MD5是报文摘要 MD (Message Digest) 的第5个版本。
基本思想:用足够复杂的方法将报文的数据位充分“弄乱”,报文摘要代码中的每一位都与原来报文中的每一位有关。
MD5算法步骤
- 附加:把任意长的报文按模 264 计算其余数(64位),追加在报文的后面(长度项)。
-
填充:在报文和长度项之间填充 1 - 512 位,使得填充后的总长度是 512 的整数倍。填充的首位是 1,后面都是 0。
- 分组:把追加和填充后的报文分割为一个个 512 位的数据块,每个 512 位的报文数据再分成 4 个 128 位的数据块
- 计算:将 4 个 128 位的数据块依次送到不同的散列函数进行4轮计算。每一轮又都按 32 位的小数据块进行复杂的运算。一直到最后计算出 MD5 报文摘要代码(128位)。
安全散列算法(SHA)
SHA 比 MD5 更安全,但计算起来却比 MD5 要慢些。已制定 SHA-1、SHA-2、 SHA-3 等版本。
基本思想:
- 要求输入码长小于 264 位,输出码长为 160 位。
- 将明文分成若干 512 位的定长块,每一块与当前的报文摘要值结合,产生报文摘要的下一个中间结果,直到处理完毕
- 共扫描 5 遍,效率略低于 MD5,抗穷举性更高。
报文鉴别码 MAC
MD5 实现的报文鉴别可以防篡改,但不能防伪造,因而不能真正实现报文鉴别。
例如:
入侵者创建了一个伪造的报文M,然后计算出其散列 H(M),并把拼接有散列的扩展报文冒充 A 发送给 B。B 收到扩展的报文 (M, H(M)) 后, 通过散列函数的运算,计算出收到的报文 MR 的散列 H(MR)。若 H(M) = H(MR),则 B 就会误认为所收到的伪造报文就是 A 发送的。
为防范上述攻击,可以对散列进行一次加密。散列加密后的结果叫做报文鉴别码 MAC (Message Authentication Code)。注意:现在整个的报文是不需要加密的。由于入侵者不掌握密钥 K,所以入侵者无法伪造 A 的报文鉴别码 MAC,因而无法伪造 A 发送的报文。这样就完成了对报文的鉴别。
实体鉴别
仅仅鉴别发送报文的实体。实体可以是一个人,也可以是一个进程(客户或服务器)。这就是端点鉴别。
与报文鉴别的区别:
- 报文鉴别是对每一个收到的报文都要鉴别报文的发送者。
- 实体鉴别是在系统接入的全部持续时间内对和自己通信的对方实体只需验证一次。
最简单的实体鉴别
使用共享的对称密钥实现实体鉴别。A 发送给 B 的报文的被加密,使用的是对称密钥 KAB。B 收到此报文后,用共享对称密钥 KAB 进行解密,因而鉴别了实体 A 的身份。 因为该密钥只有 A 和 B 知道。
存在漏洞
- 入侵者 C 可以从网络上截获 A 发给 B 的报文。
- C 并不需要破译这个报文,而是直接把这个截获的、由A加密的报文发送给 B,使 B 误认为 C 就是 A。然后 B 就向伪装是 A 的 C 发送应发给 A 的报文。
这种攻击被称为重放攻击(replay attack)。C 甚至还可以截获 A 的 IP 地址,然后把 A 的 IP 地址冒充为自己的 IP 地址(这叫做 IP 欺骗),使 B 更加容易受骗。
使用不重数进行鉴别
不重数(nonce)就是一个不重复使用的大随机数,即“一次一数”。由于不重数不能重复使用,所以 C 在进行重放攻击时无法重复使用所截获的不重数。
在使用公钥密码体制时,可以对不重数进行签名鉴别。B 用其私钥对不重数 RA 进行签名后发回给 A。A 用 B 的公钥核实签名。如能得出自己原来发送的不重数 RA,就核实了和自己通信的对方的确是 B。同样,A 也用自己的私钥对不重数 RB 进行签名后发送给 B。B 用 A 的公钥核实签名,鉴别了 A 的身份。公钥密码体制虽然不必在互相通信的用户之间秘密地分配共享密钥,但仍有受到攻击的可能。
存在漏洞
- C 冒充是 A,发送报文给 B,说:“我是 A”。
- B 选择一个不重数 RB,发送给 A,但被 C 截获了。
- C 用自己的私钥 SKC 冒充是A的私钥,对 RB 加密,并发送给 B。
- B 向 A 发送报文,要求对方把解密用的公钥发送过来,但这报文也被 C 截获了。
- C 把自己的公钥 PKC 冒充是 A 的公钥发送给 B。
- B 用收到的公钥 PKC 对收到的加密的 RB 进行解密,其结果当然正确。于是 B 相信通信的对方是 A,接着就向 A 发送许多敏感数据,但都被 C 截获了。
中间人攻击
- A 向 B 发送“我是 A”的报文,并给出了自己的身份。此报文被“中间人” C 截获,C 把此报文原封不动地转发给 B。B 选择一个不重数 RB 发送给 A,但同样被 C 截获后也照样转发给 A。
- 中间人 C 用自己的私钥 SKC 对 RB 加密后发回给 B,使 B 误以为是 A 发来的。A 收到 RB 后也用自己的私钥 SKA 对 RB 加密后发回给 B,中途被 C 截获并丢弃。B 向 A 索取其公钥,此报文被 C截获后转发给 A。
- C 把自己的公钥 PKC 冒充是 A 的发送给 B,而 C 也截获到 A 发送给 B 的公钥 PKA。
- B 用收到的公钥 PKC(以为是 A 的)对数据加密发送给 A。C 截获后用自己的私钥 SKC 解密,复制一份留下,再用 A 的公钥 PKA 对数据加密后发送给 A。
- A 收到数据后,用自己的私钥 SKA 解密,以为和B进行了保密通信。其实,B发送给A的加密数据已被中间人 C 截获并解密了一份,但 A 和 B 却都不知道。