- 鉴别和加密是不相同的概念。鉴别是要验证通信的对方的确是自己所要通信的对象,而不是其他的冒充者,并且所传送的报文是完整的,没有被他人篡改过。
- 鉴别与授权也是不同的概念。授权涉及的问题是:所进行的过程是否被允许(如是否可以对某文件进行读或写)。
鉴别可细分为两种。
- 报文鉴别:鉴别所收到的报文的确是报文的发送者所发送的,而不是其他人伪造的或篡改的。包含了端点鉴别和报文完整性的鉴别。
- 实体鉴别:仅仅鉴别发送报文的实体。实体可以是一个人,也可以是一个进程(客户或服务器)。这就是端点鉴别。
1 报文鉴别
1.1 密码散列函数
理论上讲数字签名就能够实现报文鉴别,但这种方法在对较长的报文进行数字签名时,需要进行较多的时间来进行运算。而密码散列函数是进行报文鉴别的一种相对简单的方法。
一个安全的散列算法需要满足如下两个条件,也是散列算法的两个特性。
- 抗碰撞性。根据一个输入,找到一个其它输入得到相同的输出,在计算上是不可行的;
- 不可逆性。根据一个输出,找到一个输入其散列值等于输出,在计算上是不可行的,即不可能从结果逆向推导初始值。
注意,抗碰撞性并不是说散列算法无碰撞,无碰撞的算法不可能是一个散列算法,而只能是一个无损压缩算法,因为散列算法在计算过程中必然会丢失原文部分信息。
1.2 实用的密码散列函数 MD5 和 SHA-1
1)MD5
报文摘要 MD(Message Digest)最终被 SHA 所取代。
MD5 的不可逆性
因为 MD5 算法里面有很多不可逆的运算,会丢失很多原文的信息,无法找回,所以是不可逆的。
MD5 的抗碰撞性
王小云院士的研究成果证明可以找到 M2 使 MD5(M1)=MD5(M2)
,破坏了 MD5 的抗碰撞性。
王小云院士的研究报告表明,MD4,MD5,HAVAL-128,RIPEMD 和 SHA-1 均已被证实存在上面的漏洞,即给定消息 M1,能够找到不同消息 M2 产生相同的散列值,即产生 Hash 碰撞。
虽然 MD5、SHA1 已经被证实在数字签名存在安全问题,但是 MD5、SHA1 在密码的散列存储方面还是很安全的算法,只要密码足够复杂,加盐且迭代次数足够多,基本能够抗得住主流的口令破解方法,如暴力破解、彩虹表、字典攻击、词表重整攻击、概率上下文无关文法等。
MD5 算法的大致过程
- 先把任意长的报文按模 264 计算其余数(64位),追加在报文的后面。
- 在报文和余数之间填充 1~512 位,使得填充后的总长度是 512 的整数倍。填充的首位是 1 ,后面都是 0。
- 把追加和填充后的报文分割为一个个 512 位的数据块,每个 512 位的报文数据再分成 4 个 128 位的数据块依次送到不同的散列函数进行 4 轮计算。每一轮又都按 32 位的小数据块进行复杂的运算。一直到最后计算出 MD5 报文摘要代码(128 位)。
这样得出的 MD5 报文摘要代码中的每一位都与原来报文中的每一位有关。由此可见,像 MD5 这样的密码散列函数实际上己是个相当复杂的算法,而不是简单的函数了。
2)SHA
安全散列算法 SHA (Secure Hash Algorithm)和 MD5 相似,但码长为 160 位(比 MD5 的 128 位多了 25%)。
SHA 也是用 512 位长的数据块经过复杂运算得出的。SHA 比 MD5 更安全,但计算起来却比 MD5 要慢些。
1995 年发布的 SHA-1 也曾被王小云教授的研究团队攻破。虽然现在 SHA-1 仍在使用,但很快就会被另外的两个版本 SHA-2 和 SHA-3 所替代。
1.3 报文鉴别码
1)工作过程
- A 从报文 X 导出散列 H 后,就对散列 H 用密钥 K 加密,得到报文鉴别码 MAC (Message Authentication code)。
- A 把己加密的报文鉴别码 MAC 拼接在报文 X 的后面,得到扩展的报文,发送给 B。
- B 收到扩展的报文后,先把报文鉴别码 MAC与报文 X 分离出来。然后用同样的密钥 K 对收到的报文鉴别码 MAC 进行解密运算,得出加密前的散列 X。再把报文 X 进行散列函数运算,得出散列 H(X)。
- 把计算出的散列 H(X) 与 H 进行比较。如一致,就可以相信所收到的报文 X 的确是 A 发送的。
这样不需要加密整个报文,只需要加密固定长度的报文鉴别码,减少了很多计算资源,能很方便的保护报文的完整性。
2)密钥传递
用户 A 用其私钥对散列 H 进行运算,得出报文鉴别码 MAC。然后 A 把报文鉴别码 MAC 拼接在报文 X 的后面,构成扩展的报文发送给 B。B 收到扩展的报文后,采取的做法和前面所述的基本一样,不同的地方是,对收到的报文鉴别码 MAC 是用 A 的公钥进行 E 运算。由于入侵者没有 A 的私钥,因此他不可能伪造出 A 发出的报文。
采用这样的方法得到的扩展报文,不仅是不可伪造的,也是不可否认的。
2 实体鉴别
实体鉴别和报文鉴别不同。报文鉴别是对每一个收到的报文都要鉴别报文的发送者,而实体鉴别是在系统接入的全部持续时间内对和自己通信的对方实体只需验证一次。
- 最简单的实体鉴别:A 向远端的 B 发送带有自己身份 A(例如,A 的姓名)和口令的报文,并且使用双方约定好的共享对称密钥 KAB 进行加密。B 收到此报文后,用共享对称密钥 KAB 进行解密,从而鉴别了实体 A 的身份。
- 容易受到“重放攻击”:入侵者 C 在 A、B 之间冒用身份,转发消息
- 使用“不重数”(nonce)对付重放攻击:每次请求用一个不重复使用的大随机数,“一次一数",用共享对称密钥 KAB 对不重数进行加密
- 还是会受到“中间人攻击”:“中间人”用自己的私钥代替 A、B 的私钥,截获、转发报文