本系列文章将提供对网络安全的一般了解,以及开发人员所必需掌握的 Java编程语言的独特性能。在后续的连载中,将讨论 Java平台安全性的设计和演变,以及不同的 Java 安全性API。今后的文章还将讨论 Java 2 Platform,Enterprise Edition (J2EE)中的安全特性,J2EE 正迅速变为 .com 平台的首选。 在最近的几十年内,计算模型发生了巨大的变化,由于这些变化,出现了对大规模电子商务与电子交易系统应用程序安全的更大需求,这正如最近对几个受欢迎站点的大量拒绝服务 (DoS) 攻击所表明的那样。尤其是对于 Java 团体,随着 Java 作为因特网编程的 事实上的 标准平台出现,安全移动 Java 代码的能力已成为基本要求。 本文是系列文章中的第一篇,讨论计算机安全和密码学的一般概念。虽然可移动代码并不是一个革命性的概念,但是 Java 和因特网给计算机安全带来了一些不同寻常的挑战。Java 体系结构的演化及其对安全的影响、不同的安全 API 和工具软件以及 applet 安全,等等,将在随后的文章中讨论。 此安全性论文系列并不打算提供计算机安全问题的综合指南。计算机安全是一个多层面的问题,它涉及若干学科、部门和文化。技术投资后,接着就应该着手培训、严格的策略强制执行和总体安全策略的定期审查。 注:有关算法进展的详细信息,请参阅专题“ 二十一世纪的加密算法”;有关密钥长度在安全性中的重要性的讨论,请参阅专题“ 密钥的长度是否重要?”。 要从总体上理解什么是计算机安全,有必要考虑一下安全在日常生活中意味着什么。我们将看到,日常生活中的一般安全规则同样适用于计算机安全。 计算机安全的局限性 端到端的安全 简单性 好的系统设计需要安全
了解这样一些内容是有用的:计算机安全的防御对象、相应的防御机制,以及与计算机安全有关的不同术语。 威胁
几种攻击归属于上面提到的一个或几个类别。示例包括:
其他的攻击包括: 生日攻击、 字典攻击、 会合 攻击 (meet-in-the-middle attack) 等。(更全面的讨论,请参阅 参考资料中 Bruce Schneier 的 Applied Cryptography。) 防护物 防火墙, 周边防御的一个相当成功的示例,将内部(专用)网络与外部(公用)网络分隔开,并为公司策略提供中央控制点。然而,防火墙日益允许各种精选形式的通讯 -- 例如 HTTP -- 穿过它。 虚拟专用网络 (VPN),尽管仍然使用共享网络,但它提供的安全级别与专用网络相同,是另一个防护物示例。 密码学 机密性 如果您正在与他人交换敏感信息,您希望绝对确保只有预定的消息接收人才可以弄懂此消息,如果落入非预定的人手中,此消息实际上将变成无用的东西。机密性是用某种形式的加密技术来实现的。 认证 一旦建立了认证,在实施中对用户(或者更一般的说,委托人)的访问是 访问控制机制控制的。 Kerberos -- 基于密钥和加密 -- 展示了一种早期认证技术。这种技术使用时间戳 -- 在一个规定的时段内会话保持有效 -- 来实现这一点。为了正常工作,Kerberos 最根本的一点是,假定分布式系统中的时钟是同步的。 公用密钥基础结构 (PKI),代表一种更为普遍的认证解决方案,将在下面的几节中讨论。 Java Authentication and Authorization Service (JAAS) 框架,以基于用户的认证和访问控制功能补充 Java2 平台。JAAS 是 Java 2 Software Development Kit,v 1.3 的标准扩展。 完整性 不可否认 审计和日志 策略和访问控制 Java 2 Platform,Enterprise Edition (J2EE) 使用 基于角色的认证 来执行其策略。考虑到这一点,在 J2EE 中,业务逻辑的开发人员根据角色来限制对特定功能的访问。
虽然密码学和计算机安全是两个截然不同的主题,但是计算机安全在很多方面都依赖于密码学。
下一步,让我们了解一些与密码学有关的概念。 密码分析学 密码学算法 如果以 Kerckhoff 在十九世纪所做的工作为基础,则密码系统的安全应该完全基于密钥的保密,而不是基于算法的保密。密钥,再加上经过充分测试和分析的算法,可用密码学方法生成安全的系统。相应地,许多广泛流行的算法可用于公众审查。对许多算法所做的密码分析学工作导致了对算法的若干修改,从而使它们的功能更强大。 注:有关设计下一代加密标准的过程的信息,请参阅第一个 专题。 单向散列函数
这一算法的安全源于其 单向性,而不是其内部工作方式的保密性。更严格地说, H(M)具有以下属性:
散列法是数字签名的基本部分,将在下面讨论。 RSA 的 Ron Rivest 设计了 MD4(消息摘要)和 MD5 (RSA 是一家安全公司的名称,它由该公司创始人 Ron Rivest、Adi Shamir 和 Leonard Adleman 的姓氏首字母组成。MD4 和 MD5 产生一个 128 位散列。 SHA (安全散列法算法),由 National Institute of Standards and Technology (NIST) 与 National Security Agency (NSA) 联合设计,它产生一个 160 位散列,用于 数字签名算法 (DSA)。 SHA-1 ,在某些文献中简称为 SHA,是 1994 年发表的 SHA 的修订版。SHA 和 SHA-1 都是 安全散列标准 (SHS) 的一部分,与 MD4 函数系列有共同之处。MD4、MD5 和 SHA 是单向散列函数的一些示例。 作为一个例子,根据 MD5 算法为外观类似的消息生成了下面的 128 位散列。
对于任意长度的消息,此算法都将生成一个代表该消息的固定长度的散列。从表 1 可以清楚地看出,即使稍微修改消息,也会更改其散列。要找出散列值相同的一个替换消息,将是一件耗费时间的事情。 到目前为止,我们已经讨论了不使用密钥的单向函数。另一方面, 消息认证代码 (MAC) 是一种使用密钥的单向函数,可以用它们在系统上或用户之间认证文件或消息。 HMAC(用于消息认证的密钥散列法)就是这种函数的一个例子。 对称密码
它们具有基本的属性: 给定一个设计良好的算法,则过程的安全就在于密钥的保密。因此,对称密码的主要挑战在于密钥的分布形式 -- 通讯双方如何共享同一密钥?不同的是,非对称密码则不使用同一密钥。相反,它们依赖一个广泛可用的、自由分布的公用密钥。 使用专用密钥的加密通常比使用公用密钥的加密速度快。在一个混合的密码系统中,用于会话的专用密钥称为 会话密钥,是使用公用密钥建立的,通讯双方将会话密钥用于会话的其余部分。这是一种形式的密钥交换。其他形式的密钥交换使用更安全的通道来交换专用密钥。 可以将对称密码分类为 流密码或 块密码。流密码对位流或字节流进行操作,而块密码则对一组位进行操作。密文中的本质区别是,如果使用块密码的同一密钥进行加密,则相同的明文块将加密为相同的密文块;而在使用流密码时,则每次加密时都将明文块加密为不同的密文块。 大多数块算法都符合 Feistel 网络属性,这意味着用于加密和解密的算法是相同的,仅在密钥的应用方面存在一些差异。 有几种操作 模式。模式可以增强加密,还可以修改对称密码的特征。例如,通过使用适当的模式,可以使一个块密码的行为与一个流密码相似。下面列出的是几个重要的模式:
有几种块密码,其中包括 数据加密标准 (DES)。DES 将由 高级加密标准(AES) 代替(请参阅 专题 ,“AES:二十一世纪的加密算法”)。同时,Triple DES(3DES 或 DESede),是对 DES 的改进,它在采用 AES 之前替代 DES。在 DESede 中,加密过程是使用不同的密钥依次进行编码、解码和编码的处理,有效地增大了密钥的长度。 非对称密码
非对称密码具有以下的基本属性:
在非对称密码中,通讯双方不必共享同一密钥。然而,密钥 k1 和 k2在数学上是相关的,以便使加密和解密处理相关联。 公用密钥和专用密钥 在二十世纪七十年代中期,Whitfield Diffie 和 Martin Hellman 一起,Ralph Merkle 一个人,分别引入了公用密钥密码学。公用密钥算法的安全基于以下过程的难度:在不知道密钥的情况下,从 密文推断出 明文,以及从公用密钥推断出专用密钥。 了解下面这一点是很重要的:在大多数文献中对公用密钥和专用密钥的讨论可能是模糊不清的,因为许多文章看起来是将相同的密钥用于加密和解密,但是在讨论中隐含了这样的事实:它们所说的密钥,一个是专用密钥,另一个是公用密钥。 要注意的另一点是,在使用多个算法时,要求使用多个密钥,因为密钥对算法来说是唯一的。 下面将讨论的数字签名和证书均依赖公用密钥密码学。 数字签名 基本的数字签名协议是:
由于在大文档上签名很费时,因此通常只在消息的散列上签名。单向散列和数字签名算法被公认为是先验的。原始消息与签名一起发送。接收人用发送人的公用密钥解密散列,并将它与由收到的消息生成的散列相对照,来验证签名。下面的图 1 说明签名的生成和验证过程。该方案还有一个好处,即将文档和签名分开。 图 1. 数字签名 请注意,消息使用散列算法生成一个固定长度的散列,然后加密该散列以生成签名。这些签名有时称为 数字指纹,因为它们唯一地代表原始消息。 使用数字签名并不保证机密性,因为消息是作为明文发送的。为了进一步保证机密性,而不是发送明文消息,可以用发送人的专用密钥对它进行加密,此过程如图 2 所示。 图 2. 加密的数字签名 数字签名有几种算法,如 ElGamal 签名、RSA 或数字签名算法 (DSA)。ElGamal 和 RSA 算法都可以用于加密和数字签名。不同的是,DSA 是数字签名标准 (DSS) 的一部分,则只能用于数字签名,不能用于加密。如果希望加密,则必须将其他的加密算法与 DSA 联合使用。 下面的表 2 简明地汇总了目前所讨论过的所有不同加密算法的各种特征,并对每一种算法提供了一些示例。
证书 这些问题的解决方案就是证书。由共同信任的第三方或证书管理机构 (CA) 颁发证书。CA 不仅有公用密钥,还有用户的其他信息。证书含有一个有效期。颁发机构用它的专用密钥在证书上签名。该过程隐含一个假定,即 CA 的公用密钥是广泛可用的和真实的。 公用密钥证书以 X.509 标准为基础。CA 的一些示例包括 Verisign、Thawte (现在由 VeriSign 拥有)和 Entrust。在 Java 中, 公用密钥的基础结构
表 3 列出了许多标准,一些标准是互补的,另一些标准与上文提到的算法和标准无关。这些标准旨在能够使用上市产品提供安全性。
除了理解安全性背后的技术所需的概念以外,良好的计算机安全还要求系统管理员做到以下几点:
如果这些因素不比形成安全基础的技术更重要,至少是同等重要的。 与安全性和密码学密切相关的一个问题是 隐私权,它涉及用来控制个人信息的获取、泄露和使用的权利和责任。在进行软件系统总体设计时要考虑隐私权,在安全功能部件设计时尤其要考虑隐私权。
总的说来,本文试图通俗地解释计算机安全这一问题背后的术语。众所周知,有大量的术语需要解释;但基本的概念还是简单的。除了计算机安全之外,我们还考察了密码学对计算机安全的重要性,并详细了解了它的主要特性。 在此系列的下一篇文章中,我们将讲述这些概念与 Java 及 Java 作为因特网编程语言的角色之间的关系,还将讨论 Java 安全的各个方面,它的演变历史,以及它对计算机安全的独一无二的挑战。最后,我们将讨论影响 applet 安全的问题,也即浏览器安全与 Java applet 的关系。 |