1、附录 4 外文翻译 Java 核心技术卷高级特性 当 Java 技术刚刚问世时,令人激动的并不是因为它是一个设计完美的编程语言,而是因为它能够安全地运行通过因特网传播的各种 applet。很显然,只有当用户确信 applet 的代码不会破坏他的计算机时,用户才会接受在网上传播的可执行的 applet。正因为如此,无论过去还是现在,安全都是设计人员和 Java 技术使用者所关心的一个重大问题。这就意味着, Java 技术与其他的语言和系统有所不同,在那些语言和系统中安全是事后才想到要去实现的,或者仅仅是对破坏的一种应对措施,而对 Java 技术来说,安全机制是一个不可分割的组成部分。 Java
2、技术提供了以下三种确保安全的机制: (1)语言设计特性(对数组的边界进行检查,无不检查类型的转换,无指针算法等)。 (2)访问控制机制,用于控制代码能够执行的功能(比如文件访问,网络访问等)。 (3) 代码签名,利用该特性,代码的作者就能够用标准的加密算法来表明 Java 代码的身份。这样,该代码的使用者就能够准确地知道谁创建了该代码,以及代码被标识后是否被修改过。 下面,我们要介绍 java.security 包提供的加密算法,用来进行代码的标识和用户 身份认证。 正如我们前面所说, applet 是在 Java 平台上开始流行起来的。实际上,人们发现尽管他们可以编写像著名的“ nervou
3、s text”那样栩栩如生的 applet,但是在 JDK1.0 安全模式下无法发挥其一整套非常有用的作用。例如,由于JDK1.0 下的 applet 要受到严密的监督,因此,即使 applet 在公司安全内部网上运行时的风险相对较小, applet也无法在企业内部网上发挥很大的作用。Sun 公司很快就认识到,要使 applet 真正变得非常有用,用户必须可以根据applet 的来源为其分配不同的安全级 别。如果 applet 来自值得信赖的提供商,并且没有被篡改过,那么 applet 的用户就可以决定是否给 applet 授予更多的运行特权。 如果要给予 applet 更多的信赖,你必须知道
4、下面两件事: (1)applet 来自哪里? (2)在传输过程中代码是否被破坏? 在过去的 50 年里,数学家和技术机科学家已经开发出各种各样成熟的算法,用于确保数据和电子签名的完整性,在 java.security 包中包含了许多这些算法的实现。在下面几节,我们将要介绍消息摘要是如何检测数据文件中的变化的,以及数字签名是如何证明签名者的身份的。 消息摘要是数据块的数字指纹。例如,所谓的 SHA1(安全散列算法 #1)可将任何数据块,无论其数据有多长,都压缩为 160 位( 20 字节)的序列。与真实的指纹一样,人们希望任何两条消息都不会有相同的 SHA1 指纹。当然这是不可能的 因为只存在
5、2160 个 SHA1 指纹,所有肯定会有某些消息具有相同的指纹。因为 2160 是一个很大的数字,所以存在重复指纹的可能性微乎其微,那么这种重复的可能性到 底小到什么程度呢?根据 James Walsh 在他的 True Odds:How Risks Affect Your Everyday Life ,Merritt Publishing 出版社 1996 年出版,一书中所阐述的,你和他们所有的人都死于雷击的概率,比伪造的消息与原来消息具有相同的 SHA1 指纹的概率还要高。(当然,可能有你不认识的其他 10 个以上的人会死于雷击,但这里我们讨论的是你选择的特定的人的死亡概率)。 消息摘要
6、具有两个基本属性: (1)如果数据的 1 位或者几位改变了,那么消息摘要也将改变。 (2)拥 有给定消息的伪造者不能创建与原消息具有相同摘要的假消息。 当然,第二个属性又是一个概率问题。让我们来看看下面这位亿万富翁下的遗嘱:“我死了之后,我的财产将由我的孩子平分,但是,我的儿子 George应该拿不到一个子。” 这份遗嘱的 SHA1 指纹为: 2D 8B 35 F3 BF 49 CD B1 94 04 E0 66 21 2B 5E 57 70 49 E1 7E 这位有疑心病的父亲将这份遗嘱交给一位律师保存,而将指纹交给另一位律师保存。现在,假设 George 能够贿赂那位保存遗嘱的律师,他想修改这份遗嘱,使得 Bill 一无所得。当然,这需要将原指纹改为下面这样完全不