返回列表 发帖

无线安全:掌上 Palm 中的安全性

Kim Getgen 本月着手撰写关于保护 PDA 的系列三部分文章。首先,您将了解安全套接字层(Secure Socket Layer)协议的内部工作原理,以及如何对其进行优化以用于紧凑的空间(如嵌入式 OS)。
最新的 Palm 操作系统这个月刚刚在 PalmSource 大会(PalmSource Conference)上发布。令人感兴趣的是,其安全性得到了提高,当这种 OS 在今年夏天投放市场时,这种加强了的安全性将为其提供安全性保护。新闻稿声称新的安全性特性将保证“敏感数据的保密性…… [通过提供] 强大的 128 位系统宽度的数据加密服务(该服务基于 RSA Security 实际标准的 RC4 加密算法)……[以及] 端对端安全性……都通过用于电子邮件、Web 浏览以及在线交易的安全套接字层(Secure Socket Layer (SSL))服务来提供。”(请参阅参考资料以获取至该新闻稿的链接)。然而,对于大多数应用程序开发人员而言(实际上他们必须依赖于平台,除了安全性以外他们还担心其它更多问题),在读者中引起共鸣的一个问题是 — 所有这些新安全性到底意味着什么呢?
对于为 Palm 编写应用程序的应用程序开发人员来说,这些新安全性意味着他们有了可在上面进行构建的强壮加密术和安全性协议的基础,该基础是由安全性专家设计的。Palm 的目标是通过提供开发人员可以“挂入”的坚固的安全性基础来简化其平台上安全应用程序的开发。这将为开发人员完成大量繁杂的工作。据估计,为 Palm 编写的软件程序数量比为其它任何手持平台编写的软件程序数量多八倍,对于担心 Palm 应用程序所提供的安全性级别的企业客户来说,这是一个好消息。
本月的专栏文章是三部分系列文章(有关影响 PDA 的安全性问题)的第一部分。本文详细地阐述了 SSL 协议 — 开发人员可以利用的重要安全性特性之一。我们将研究其工作原理以及如何对其进行优化以用于诸如嵌入 OS 之类的受限环境。第二部分将集中讨论日益重要的代码签名,代码签名可以提供使 OS 免遭恶意代码的攻击的保护级别。本系列的最后一部分将探讨用于客户机端认证的无线设备的使用,它是如何被支持的,以及它允许最终用户做什么。
攻击密钥 — 长度问题
对称算法最安全的实现非常关注密钥长度和密钥派生。这些考虑使攻击者极难计算出密钥。为了更好地理解这些概念,让我们探讨一下某人可能会如何攻击密钥。
最常见的密钥攻击是“蛮力攻击”,这意味着攻击者将尝试每个密钥直到找到正确的密钥。让我们引用 Burnett 和 Paine 例子:
“假定您的密钥数在 0 和 100,000,000 之间。攻击者获取您的密文(可能是 8 字节或 16 字节长),然后将其连同“所谓的密钥”0 一起提供给解密算法。算法执行自己的任务并生成结果。如果生成的数据显得很合理,那么 0 可能就是正确的密钥。如果生成的数据显得不合理,那么 0 就不是正确的密钥。如果这样的话,就尝试 1 然后是 2、3、4 等等。”(引自 RSA Security's Guide to Cryptography,2001 年)
当攻击者编写蛮力攻击程序时,他们可以快速地尝试新的密钥,每秒钟尝试许多密钥。这就是密钥长度十分重要的原因。那么密钥该多大呢?40 位密钥,其值的可能范围是 0 到 1 万亿。56 位密钥,这个范围则是 0 到 82 乘以十的十五次方。一般规则是:密钥长度每增加一位,蛮力攻击成功所需的时间就会增加一倍。
128 位密钥有多安全呢?早在 1997 年,RSA Security 就设置了现金奖赏来奖励第一个破解 40 位密钥的人。该密钥在 3 小时内就被人破解了。破解 48 位的密钥则持续了 280 小时。在 1997 年,发出了另一项有关 64 位密钥的挑战;但该密钥至今还未被破解。还需记住的是,参与这些挑战的人比大多数黑客更能充分利用计算机的能力。
如何获取随机密钥?
第二种攻击试图复制用来创建密钥的“种子”值。这种攻击专门研究密钥是如何派生的。例如,如果攻击者能够分析不同的密钥并找到其中的关系,那么您的密钥就无法阻挡攻击了。这类似于对 WEP 的成功攻击。因此,最佳的算法实现都会考虑生成的密钥的随机性。为了生成随机密钥,将伪随机数生成器(PRNG)和随机数生成器(RNG)与种子(能根据对称算法生成“最佳”秘钥)结合使用。但是,即使使用了很好的随机数生成器,如果种子太小,那么这样生成的密钥可能也易于受蛮力攻击的影响。如果攻击者很容易就能尝试所有可能的值来找出正确的种子,那么就可以用该种子来计算出密钥。

安全套接字层协议
SSL 是一种通信协议,它概括了使用加密术来获取高级数据保密、数据完整性和认证的标准方法。实质上,它通过保护传输中的数据保护了应用层。听起来很复杂?的确如此,但 SSL 可能是有线世界中使用的最流行安全性协议。SSL 内建在每个 Web 浏览器中,当它同连接另一端的认证服务器建立了连接时,它会创建端对端的数据保密。
因此您可能想知道:如果它真的工作得这么好,那么为什么我们现在才听说呢?简单的答案是它太“胖”— 运行 SSL 需要许多代码,差不多 200k,这限制了它在嵌入环境中的应用。
一直以来存在的主要问题是如何为无线和嵌入客户机构建该协议的更“瘦”版本,这些客户机将仍然同 Web 服务器互操作,但却是通过具有适当吞吐量、易变的无线网络来获取数据。本文概述了一些基本原则,这些原则正在帮助象 Palm 一样的公司在嵌入环境中使用 SSL。但首先我们将概述 SSL 背后一些基本的安全性概念,这样将为那些不熟悉安全性基本知识的人提供了良好的入门知识。第二节概述了协议的机理;最后一节讨论了一些方法,通过这些方法可以定制 SSL,从而在无线世界里获得更佳的吞吐量和性能。
SSL 背后的安全性概念
首先,您必须知道:SSL 是安全性传输协议,它正好位于 TCP/IP 堆栈中应用层的下面。它被安全地构建到流数据中。该协议定义了四项重要的安全性特性,后面将对它们详细加以讨论:
使用对称密钥加密的数据隐私
使用消息认证检查(MAC)的数据完整性
使用 X.509 数字证书* 的服务器认证
使用 X.509 数字证书* 的客户机认证
*在本系列文章的第三部分,我们将更深入地了解认证和 PKI 概念。
数据隐私。 对于安全性专家来说,数据隐私意味着使用加密技术将数据变得杂乱无章,从而让除期望的接收方之外的任何人都无法理解该数据。SSL 协议中的数据隐私机制提供了一种对两点(通常是客户机和服务器,但对等方案也可以)之间传输的数据进行加密的方法,一旦信息到达其最终目的地就对信息进行解密。为了实现这一点,协议概括了一些对称密钥算法,这些算法可以用来对上面的数据进行加密,其中最流行的算法是 128 位加密的 RC4 算法。对称密钥加密术只是一种加密数据的方法,在这种方法中双方共享一个秘密,称为“密钥”,它由算法生成。“密钥”一词是一个非常有用的类比,因为它的言外之意是把您试图保护的东西藏起来。
对称算法这样工作:首先,试图发送秘密信息的双方必须首先就他们想使用的对称密钥算法达成一致。然后,他们确定使用多长密钥。一旦做出了这些决定,第一方就生成一个随机密钥,并使用对称算法加密信息。为了解密该信息,第二方需要使用相同的算法和相同的秘钥。
对称密钥加密术中出现的问题是该如何将秘钥交给位于不安全线路另一端的一方。这个问题就是加密术领域内通常所说的“密钥分发问题”。这的确是个令人头疼的问题,因为如果不对密钥进行保护,那么攻击者就可以拦截并解密您的消息。(参阅侧栏攻击密钥。)
这如何应用到 Palm OS 5 呢?Palm 所做的发布表明他们将在其 SSL 实现中使用 RC4 128 位对称密钥加密。如果能够恰当地实现,它将提供同有线世界中提供的相同级别的保护。
数据完整性。 加密术不是仅能对文本进行加密。有些算法可以用来检查在传输过程中信息是否被更改过。对于安全性专家来说,数据完整性意味着数据在传输过程中未被更改。该数据可以是明文或密文 — 这都不要紧。我们这里所关注的是使用一种算法,该算法将检测包括插入额外空格到移动十进制小数点在内的任何变化。
SSL 协议中应用了基于散列的消息认证校验和(Hash-based Message Authentication Checksum (HMAC))。HMAC 是一种执行“校验和”的算法。它通过对数据“进行求和”来检查数据是否被更改了。在发送数据以前,HMAC 算法对数据块和一个共享秘钥进行“散列操作”,以生成称为“摘要”的东西,它被附加给要发送的数据块。当数据和摘要到达其最终目的地时,就使用 HMAC 来生成另一个校验和。如果两个数字相匹配,那么数据就未做任何更改。如果数字不匹配,那么传输过程中就有什么地方出错了,甚至可能意味着某个居心叵测的人修改了文本。
简单点说,校验和类似于指纹。它根据消息中的数据生成一个唯一的摘要。正如指纹一样,如果消息块中有一个字节改变了,那么消息摘要算法将会在另一端检测到这一改变,因为每个摘要都是独一无二的。
什么是 SSL 协议的工作原理?
为了使工作简单起见,SSL 协议由三个主要阶段组成:
握手协议
进行加密和解密的“记录层协议”
“警报协议”定义警报消息,如果在 SSL 协议的任何阶段发生错误就会交换这些消息。
让我们略微详细地讨论一下每个阶段。
握手协议。握手协议在客户机和服务器间执行以建立安全的连接。术语“握手”非常贴切,因为它概括了客户机和服务器需要遵循的过程,以通过交换一些消息来相互介绍彼此。在交换过程中,服务器和客户机必须就它们将使用的 SSL 协议版本达成一致,还必须在双方所理解的算法的基础上就它们将使用的加密算法达成一致。同时还需要服务器产生一个由可信的认证中心签名的 X.509 数字证书来对它自己进行认证。
握手协议中交换的信息由一些在客户机和服务器之间发送的消息组成:
客户机消息:
客户机问候
客户机证书消息(可选,仅当服务器需要从客户机请求证书时)
客户机密钥交换消息
客户机验证消息(可选)
更改密码规范消息
完成的消息
服务器消息:
服务器问候
服务器证书消息
服务器密钥交换消息
认证请求消息(可选)
服务器问候完成消息
当握手完成时,客户机和服务器就成功地交换了所有信息,这些信息将定义 SSL 协议将如何实现,以及如何开始加密应用程序数据。
“记录层”协议。数据会被传输到该层,并且该层还能从应用层接收数据。简单地说,它定义了加密、解密以及检查数据完整性的过程。
记录层从上层应用程序接收连续的数据流,并将数据分解成更可管理的明文块。每个文本块大小为 16k 或更小。
为每个明文记录计算 MAC 以便可以检查数据的完整性。
使用以前协商好的对称密码对明文块和其 MAC 进行加密。
为每个记录附加一个头作为前缀。在每次传输中还包含序列号以便可以检测到丢失的、被更改的或额外的消息。
最后,将有关如何处理每个记录的信息附加到头上。
“警报”协议。警报协议概括了某一方检测到错误时所发送的消息。当致命的原因终止了连接时,警报消息可以是致命的或非致命的。客户机和服务器之间交换的警报很多。一些示例包括:
错误的 MAC 记录 — 如果收到了不正确的 MAC
握手失败 — 发送方无法通过握手中的可接受的安全性级别(密码组可能不够“牢固”)
无证书 — 证书是不可接受
错误的证书 — 无法验证证书的签名
证书过期 — 证书已过期
优化运行于无线网络上的受限设备
为了使 SSL 在通过无线网络通信的嵌入式客户机上工作,可能要修改大量代码以便使 SSL 的性能最佳并且吞吐量最大。同时,不同的更改可能会减少代码长度。这些都是设计问题,其中必须考虑折衷方案以便为您的特定环境获取最佳效果。然而,SSL 专家可以定制代码以协商出允许 SSL 在嵌入式环境中很好工作的折衷方案。
请记住,要在设计中定制 SSL 的同时又要获取最大的安全性,就应该让安全性专家参与设计。设计时一个简单的错误不仅会使产品容易遭受致命的安全性攻击,而且修订错误还会花费大量金钱。前面我们都看到过这种情况的发生(请参阅侧栏攻击概率)。因此,继续您的工作时请慎重,要明白随意更改 SSL 可能会使它更快,但您可能在不知不觉中就降低了它的安全性。
为了更好地理解如何使 SSL 在嵌入式环境中安全地工作,我同 SSL 专家 Eric Young 一起探讨了这个问题,他是 RSA Security 的技术指导。Eric 目前从事新的 Palm OS 中 SSL API 方面的工作。同 Eric 一起呆上五分钟,您就会开始明白为什么 Palm 依赖于他的专长以设计用于新 OS 的 SSL 堆栈。他在将性能提高 20% 过程中所花费的时间量、所使用的协议知识以及对细节的注意简直妙不可言。如果您正在新的 Palm 平台上开发应用程序,那么您将自然而然地从 Eric 现在正在做的工作中受益。下列三点将让您了解为了让 SSL 在这类环境下更好地工作可能会考虑的折衷方案:
攻击概率
曾经发生过所描述的这些攻击吗?脱口而出的答案是“是”。最近的 WEP 问题可以被追溯到错误的密钥派生。另一个示例是 Netscape 的 1.1 版本 SSL 中使用的脆弱的种子(自那以后就将这个问题纠正了,以后未再应用)。Netscape 通过使用收集下列信息的 PRNG 来为其对称密码创建种子:
时刻(日期、年份、小时、分和秒)
进程标识符和父进程标识符
但因为每个标识符只有 15 位,很容易被破解,而且攻击者可以通过查看 SSL 会话来知道时间(日期、年份、小时和分),唯一可以保护种子不被破解的东西是会话发生时的精确时刻。由于一分钟只有 60 秒,因此只有 60 种可能的值来对付蛮力攻击。这些密钥不到一分钟就可破解。
这就是为什么安全性专家经常说“有用的是实现”的缘故了。拥有适当的密钥长度并且有办法生成“好的”随机数是对秘钥进行保密的唯一途径。

1. 减少代码大小并且知道从何处着手该工作。
以 200k 代码基数作为开始并且知道从哪着手减少代码的工作,以允许代码适合于嵌入环境(该环境仍然安全的)是一项真正的技巧。对于我来说,这听起来简直就象看到 Houdini 被固定在 500 磅的铅锤砝码上扔到水里后却没有被淹死一样。其思想是丢掉所有您不需要的“重量”,例如“胖”版本代码中所含的额外算法。然而,这里的技巧是不要丢得太多 — 削减一些算法将牺牲同所有运行 200,000K 代码的 Web 服务器互操作的能力。如果削减其它内容,您会让代码变得不很安全。这是一项很难的工作。
底线是:SSL 是为“胖”客户机/服务器环境设计的,但通过慎重地选择削减的内容,可以将 SSL 代码变得最少,但仍然可以提供高级别的安全性以及与运行较为笨重版本的 SSL 代码的 Web 服务器的互操作性。
2. 通过减少数据块大小来加快无线网络的响应速度。
还记得我什么时候说过数据在 SSL 协议的“记录层”被拆分成 16k 大的数据块吗?就是在这里,使用 MAC 对每个 16K 数据块进行散列,然后对数据块进行加密,再进行发送。Eric 正在设计一种方法以对 16K 的数据块进行解密,这些数据块每次传到嵌入式客户机的大小是 1k。最终,用户在应用程序中会得到更快的响应速度。
为什么有这么大的改善呢?WAP 的 WTLS 相对于 SSL 的一个优点在于它在无线网络上发送小的数据报包(少于 1k)而不是流数据(一次 16k)。这就回到了 WAP 试图解决的最初问题了,这个问题就是如何在不很可靠却挑剔的无线网络上发送数据。但通过修改 SSL 协议来解密更小的数据块,应用程序的响应速度改进了对类似于 WTLS 的环境的创建。
3. 优化握手。
如果有办法来修改握手过程以减少客户机和服务器之间的往返次数,那会怎样呢?Eric 认为减少往返次数可以为实际的性能利益提供更大的吞吐量。这一点解释起来象一个逻辑问题。这个逻辑问题是这样的:您要将一只猫、一只狗、一只山羊和一只鸡带过一个湖,但如果您不在,狗和猫不能呆在湖的同一侧,而且您每次只能带一只动物过湖,要求您找出最少的往返次数 — 据此您可以想象修改握手的过程是怎么样的了。解决这一 SSL 问题的诀窍在于要减少往返次数,但仍然同另一端的 Web 服务器互操作而不产生导致杀死整个会话的致命错误。
如何获取随机密钥?
第二种攻击试图复制用于创建密钥的“种子”值。这种攻击专门研究密钥是如何派生的。例如,如果攻击者能够分析不同的密钥并找到其中的关系,那么您的密钥就无法阻挡攻击了。这类似于对 WEP 的成功攻击。因此,最佳的算法实现都会考虑生成的密钥的随机性。为了生成随机密钥,伪随机数生成器(PRNG)和随机数生成器(RNG)与种子(能根据对称算法生成“最佳”秘钥)结合使用。但是,即使使用了很好的随机数生成器,如果种子太小,那么这样生成的密钥可能也易于受蛮力攻击的影响。如果攻击者很容易就能尝试所有可能的值来找出正确的种子,那么就可以用该种子来计算出密钥。
致谢
特别感谢 RSA Security 的 Eric Young 和 Steve Burnett,他们在百忙之中抽出时间来解释这些概念并审阅本文,感谢他们同我们一起分享他们的知识。我也要感谢 Stephen Paine 的杰出工作,在他同 Steve Burnett 合著的最新书籍 RSA Security's Official Guide to Cryptography 中,他编写了有关 SSL 协议的内容。

返回列表 回复 发帖