- 主题
- 0
- 积分
- 0
- 贝壳
- 0 个
- 来自
- 广东梅州
- 注册时间
- 2006-10-19
- 最后登录
- 2006-10-19
|
让软件运转:历经考验的真正加密
使软件安全的唯一途径是使用已确认的,坚不可摧的密码算法
Gary McGraw 和 John Viega
Reliable Software Technologies
2000 年 6 月 6 日
内容:
对称密码术
对称算法
安全性
DES 和 AES
公钥密码术
RSA 算法
攻击公钥
您的定单安全吗?
参考资料
关于作者
这是有关密码术三篇文章中的第二篇,在这篇文章中,Gary 和 John 讨论了应该考虑使用哪些历经考验和测试的加密技术,以及使用它们的原因。
在上一部分中,我们介绍了密码术背后的思想,并说明了为什么它在开发安全性关键型代码时非常有用。从上一篇中学到的最重要的一课就是永远不要使用自己的密码算法。最好的办法是从密码术专家花费多年发明和测试的经验中借鉴大量好的想法。
在选择密码解决方案时,开发者要做出的一个最常见的决定是使用对称密钥算法(例如 DES)还是公钥密码术(例如 RSA 或 ECC)。在本专栏中,我们提供了两种算法的快速介绍,并为您提供在每种算法之间取舍时所涉及到的一些最常见的好处与弊端。(请记住,尽管我们时常应用和分析使用密码术的软件,但我们并不是密码专家。如果有任何疑问,请查询其它信息。)
对称密码术
密码术的对称算法主要用于数据的机密性,它的副作用是数据完整性。通信双方在计算中使用它们共享的单一密钥。必须保证共享密钥的安全才能确保加密文本的机密性。
在对称密码中,同一个密钥用在加密和解密明文消息中。消息和密钥是以加密算法的输入提供的,产生可以在非安全媒体(例如因特网)上安全发送的密文。在另一方,解密算法(必定与加密算法紧密相关)使用密文和相同的秘钥作为输入,然后恢复原始消息。
下面的图 1 中显示了对称算法的高级概述。
http://www-900.ibm.com/developerWorks/cn/security/tried/crypto1.gif
由于对称密码通信中的双方都必须具有相同的密钥,并且密钥必须保密,所以需要进行周密的安排来安全地分发秘钥。密钥一旦泄露,这种算法就失去了它的所有威力。分发密钥的一个方式是将它复制到软盘上,然后交付给希望与之安全通信的那个人。这种密钥分发方法中的薄弱性在于对称算法的最大缺点 -- 一旦丢失磁盘,就失去所有安全性。
Diffie-Hellman 是一种众所周知的协议,用于在非安全媒体上分发对称密钥(请参阅参考资料)。然而在使用这些协议时,必须知道正确身份验证的需求。与远程服务器安全地交换密钥当然是有可能的,但并不保证(除非您要求)您是在向正确的实体发送密钥。可能与直觉相反,为对称密码交换秘钥的最常见方法是通过使用公钥密码术执行的(在下面讨论)。
对称算法的类型
对称算法的两个主要类别是块密码和流密码。块密码将消息分为固定长度的块(最常用的块为 40、56、64 或 128 位)。输出的长度通常与明文的长度相同。如果明文与块长度(即块长度的整个数字因子)不是完全对齐的话,通常就会用附加无用数据的手段来填充至正确长度。加密算法本身主要负责所有的填充操作。与块密码相对应,流密码在任何时侯都是加密单一的位。流密码比块密码要快得多,但我们经常使用的最广为人知的以及研究最为透彻的对称算法是块密码。
要从最简单的角度来理解块密码,就是每一块数据都是单独加密的。据说这种类型的密码是以电子代码书 (ECB) 方式工作的。要事先警告一下,这种方法明显会带来一些安全性风险。例如,假设数据文件中每一块的长度是 64 位,每块都单独加密。每次加密 64 位的明文字符串 "security"(假设每个字符 8 位)时,都将加密成相同长度的密码文本字符串。如果攻击者看到样本消息的明文,而消息包括的字 "security" 恰巧与 64 位的边界对齐,那么每条带有这样对齐的 "security" 的消息就立刻对攻击者是透明的。
一些信息,例如编码特定的字的方法,在某些情况下可能对攻击者大有帮助。在一次攻击中,通过将以前记录的块插入新消息,坏人在不知道用来加密信息的密钥的情况下就可以修改加密过的数据。为更深入地进行探讨,请考虑一个付款系统,在这个系统中,存款以严格加密的块密码格式被发送。在我们的示例中,前 128 位代表将钱存入的帐号。余下的消息将存款金额、发送消息的时间,以及某些其它信息进行编码。如果攻击者知道前 128 位代表的是帐号,并且如果攻击者恰巧还知道目标帐号加密成一个特定的字符串,他就可以修改正在发送的消息,将存款转向目标帐户。攻击通过用攻击者自己的帐号(也是以加密格式)来替代加密格式表示的实际帐号进行。真糟糕!
严格地说,流密码由于其设计方式而不受这种“替换”问题的影响。但并不是说块密码就一无是处了。可以修改块密码来降低我们上面所说明的风险。要避免这种问题,有几种不同的策略。例如,以密码块链接 (CBC) 方式,仍然是一次加密一块,但每块的明文在加密前要经过与前一块密码文本的 XOR 运算。这是块密码普遍使用的一种方式。实际上,CBC 方式是许多块密码的缺省方式。另一种方式称为计数器方式,它使用任意但可重新产生的数字顺序作为密码算法的额外输入。特定的顺序不是很要紧。通常按时间取得的伪随机的序列就足够了。在加密前,计数器与明文进行混合。使用任何这类方法时,计数器不能经常重复某个数字,否则优点就不存在了。通过确保使相应的密文块不同,在块密码中使用 CBC 或计数器方式可以帮助降低一条消息(或在多条消息之间)中相同明文块多处出现时所遇到的风险。
在大多数情况下,我们讨论过的几种方式都正确置入算法实现中,因此可以选择在特定应用程序中使用哪种方式。通常我们建议您使用 ECB 方式,但您需要根据环境来选择方式。每种方式都有其自己的安全性内涵。CBC 代表的是个比较可行的解决方案,但攻击者可能将一些无用信息放在加密消息结尾或将它引入到消息中间。可以使用两种预防手段来避免类似问题。首先,务必要知道哪里是消息的结尾。在消息开始处对这类信息编码,或让它在协议中隐含起来。确保在继续之前,接受方检查了长度信息。其次,向数据添加某种类型的校验和,这样可以检测到在消息中间进行修改的情况。(密码校验和非常适合于这个目的,我们将在以后的主题“密码散列算法”中讨论它们。)这些预防措施有助于消除篡改的问题。
应用的密码术
根据密码专家 Bruce Schneier 的说法,真正长的消息仍然可能猜出其模式,但以 64 位的块为例,消息长度在 34 吉字节以内是不会有问题的。根据不同的时间,最好进行研究来确定哪种方式最适合于特定的应用程序,特别是因为每种方式都有不同的功效和容错注意事项。在 Bruce Schneier 的 Applied Cryptography 中提供了每种常用块密码方式各自的优缺点的详细讨论(请参阅参考资料)。
对称算法的安全性
如果不考虑保证秘钥安全的问题,对称块密码的安全性就取决于两个主要因素。第一个,也是最重要的因素是算法的质量。第二个因素,也是不太重要的因素是所使用密钥的长度。
块长度也可能是一个因素。64 位的块可能不够安全,但 128 位的块应该非常合适。
研究社区已经做了大量开发安全对称密码的工作。但演示密码安全性仍然是个极其困难的问题。没有一种实际的密码算法是绝对安全的。
有一种完美的加密算法存在,称为“一次性密码本”。使用这种算法的情况下,n 位的明文消息与 n 位的随机数字执行 XOR 操作(产生 n 位的密文)。在这种情况下,如果拦截到 64 位消息,并且如果密钥是真正随机的,所有 264 个可能的位串都是同样有可能的。除了其原始长度之外,密码文本中没有信息可以泄露明文的任何结构。在一次性密码本中,永远不能重用相同的密钥,否则这种方案的安全性就不存在了。另外,与任何对称算法一样,它有一个相当严重的密钥分发问题。由于必需的密钥长度太大,所以通常认为一次性密码本是不实用的。想象一下尝试在吉位每秒能力的网络上使用一次性密码本来加密数据!但磁盘空间越来越便宜。随着带宽和存储器的价格继续回落,一次性密码本可能会变得比较普遍。
密文总会泄露有关原始明文的信息,这些信息在不需要拥有密钥的情况下就可以找到。攻击者的一个难题是识别泄露的信息。
所有密码算法的重要目标是使密码破译变得极其困难。其它重要目标包括速度和内存最小化。不幸的是,使密码破译困难并不是那么容易做到的。有经验的密码专家要设计一种能适应所有已知形式的攻击的算法并非不可能。再说,针对完全未知类型的攻击设计算法要困难得多。许多人都相信,但没有人能肯定地说,美国国家安全署 (NSA) 已研制出了针对常规块密码的复杂攻击,但他们还没有和其它国家分享这一成果。另外,没有传言说哪种针对任何算法的类型的攻击将在近期内被发现。密码专家所能做到的就是分析与已知攻击相关的密码,然后用那种方法来判定它们。
在谈到密钥长度的问题时,通常认为 128 位对于需要在一般人类寿命期内进行保护的消息就足够了(当然,除蛮力攻击外,假设没有其它攻击能够对一种算法实施)。另外,认为 112 位已足够。为保证安全,需要考虑 256 位,相信这种长度的密钥在宇宙有限时间内对于由任何现有计算材料组成的计算机来说都足够安全,即使使用蛮力攻击,发现密钥的可能性也是非常小的。从另一角度考虑,64 位密钥对于高安全性的应用程序来说也太小了。据 Schneier 说,早在 1995 年就曾有人希望花 1000 亿美元来在一分钟内破解 64 位密钥。如今有一些计算资源能够在一年内完全破解这样的密钥。而 40 位密钥比没有任何安全性好不了多少。
数据加密标准 (DES) 和高级加密标准 (AES)
对称算法的使用相当广泛,科学家们已经对它们进行了深入研究。事实上有几百种这样的算法,其中有些很好,有些就不行。最常用的对称算法是数据加密标准 (DES),一种使用 56 位密钥的块密码。它是由 IBM(及一些伙伴)在 NSA 指导之下创建的,已成为多年来美国政府的标准。
密钥长度
密钥实际上有 64 位,但密钥有 8 位是奇偶校验位。因为奇偶校验位是密钥其它位的函数,它们不提供附加的密码安全性,意味着 DES 密钥实际只有 56 位在起作用。
许多现代密码都是以 DES 为模式的,但很少密码能够象 DES 那样经受得住密码破译。DES 的主要问题是其密钥长度很短,完全不适合于当今的形势。
有可能使密钥长度很短的 DES 更安全,但这不是随意就能做到的。一种(不好)的想法是许多人尝试应用 DES 两次 -- 称为双重加密。在这种方案情况下,使用一个密钥为消息加密一次,然后使用另一个密钥再次加密(密文到修改过的密文)。一种非常精明的攻击最后证明这种双重加密并不比单重加密更好。实际上,使用某种类型的密码情况下,多重加密可能并不比单重加密好(一种称为封闭式密码的类别)。应避免使用封闭式密码,因为它们更容易遭到攻击。
尽管双重加密不是非常有效,但证明三重加密则有效得多,与许多天真的人曾对双重加密寄予的希望一样。例如,56 位 DES 在三重加密后,产生 112 位长度,相信这种长度对于任何应用程序来说都已经足够了。三重加密的 DES,或者简称三重 DES(通常写成 3DES)是一种流行的现代对称块算法。
但三重 DES 不是包治百病的万灵药。三重 DES 的一个问题是它的速度或有关速度的不足。部分是由于速度的原因,美国商务部的国家标准和技术协会发起了高级加密标准 (AES) 的角逐。到目前为止,NIST 选择了五种算法作为该标准的最终入围者。将在 2000 年年底之前宣布它们当中的获胜者。
AES 角逐的一个风险是所有算法都是相对比较新的。这些候选算法在短时间内没有得到详细检验,无法与对多年来一直使用的 DES 进行的深入检验相比。不过,仍然有些人相信 NSA 在 DES 中放置的隐蔽的“后门”会带来一些风险,使它们易于受到攻击。这些人似乎更欢迎 NSA 没有插手的标准(然而,NSA 与 NIST 仍然有相当密切的关系)。事实上,除了相对较短的生命期,AES 获胜者的算法(在下 50 年中使用)至少大概与 DES 有史以来的算法一样好。
尽管三重 DES 有一些性能问题,但目前它还是倍受推崇的解决方案。这种算法一个最大的好处是它是免费使用的。可以从因特网上下载几种 DES 好的实现。AES 获胜者也将免费使用,并至少提供一种免费的参考实现。五个候选算法中有许多已经是免费的。对于多数应用程序来说,AES 候选算法比 DES 要快很多。
三重 DES
尽管 DES 是技术上的标准,但大部分专家都认为在 AES 竞赛结束之前,三重 DES 是实际上的过渡期标准。
有大量商业对称算法也可以使用。因为这些算法是专有的,所以往往无法仔细分析它们,至少无法在公开情况下。但也有一些专有算法提供了良好的安全性,并且能相当有效地运行。不过我们暂时没有找到任何压倒多数的理由向大多数应用程序推荐除三重 DES 以外的其它任何标准,以及在宣布了 AES 获胜者之后不推荐 AES 获胜者的理由。
对称密钥解决方案的一个问题是每一对通信代理都需要唯一密钥。这样就出现了在有许多用户的情况下管理密钥的难题。每一对唯一通信实体都需要唯一密钥!为了绕过这个问题,有一些设计者转而使用密钥派生算法。这种想法是使用主密钥来为每个通信对派生出一个唯一密钥。大多数情况下,密钥派生使用唯一的用户标识信息(例如用户序列号)来转换主密钥。这种方案的固有风险是显而易见的。如果泄露了主密钥,所有希望就破灭了。实际上,即使可能只破译了一个派生密钥,也会为攻击者提供足够多的主密钥信息。如果不考虑这种风险,许多系统都依靠带有密钥派生的对称算法来控制密码成本。
在相关实践中,设计者对于两个代理之间所有加密的通信通常利用会话密钥而不是使用同一个对称密钥。在上述派生的密钥中,它的想法是使用主密钥为每个通信对使用会话密钥,可能它本身就是从全局主密钥中派生出的。在泄露会话密钥的情况下,系统可以继续派用场。再次重申,从主通信对密钥中派生会话密钥的想法仍然会对整个系统带来风险。
公钥密码术
我们在前面一节提到过,对称密码术最大的一个问题就是密钥分发问题。困难在于解决如何在非安全媒体上与远程方安全地交换秘钥。公钥密码术完全不存在密钥交换问题。在公钥系统中,用于密码操作的是一对密钥,而不是单一密钥的副本。两个密钥中有一个是公开可用的,称为 公钥。这个密钥可以自由地散发、放在网页上、广播等等。公钥用于加密消息。另一个密钥与第一个不同,必须保持私密。它称为 私钥,用于解密消息。私钥的安全性与对称算法中的密钥安全性一样重要。这两种算法方式的根本差异在于:在公钥密码术中,永远不需要与任何人共享私钥,因此就完全避免了密钥分发问题。
在公钥系统中,发送方使用接收方的公钥来为消息加密。受到算法缺点的限制,在假设算法正确实现的情况下,唯一能解密使用这种方法加密的消息的人应该是拥有相关私钥的那个人。这个系统与任何人都可以向其中投信的邮箱类似。在这种相似情况下,没有人可以轻易地从信箱中取邮件,除非他们拥有能够开启邮箱的那个小心保管的秘钥。
下面的图 2 中显示了公钥密码术的图形概述,说明 Alice 向 Bob 发送消息时发生了什么事
http://www-900.ibm.com/developerWorks/cn/security/tried/crypto2.gif |
|