标题:
在 WebSphere Studio Application Developer V5 中使用 Java 密码术扩展
[打印本页]
作者:
心恋无悔
时间:
2004-4-3 18:56
标题:
在 WebSphere Studio Application Developer V5 中使用 Java 密码术扩展
引言
Java™ 密码术扩展(Java™ Cryptography Extension,JCE)为下列密码术功能提供了框架和实现方法:
加密
密钥生成
密钥一致
消息认证代码(Message authentication code,MAC)算法
安全流
密封的对象
在 JCE 框架内,您可以把其他库配备的密码术作为服务提供程序插入。JCE 的下载包中包含 Sun JCE 服务提供程序(Sun JCE Service Provider)。其他供应商(包括 IBM®)也都提供了各自的 JCE 服务提供程序的实现,您可以把这些实现插入 JCE 框架。
本文之前的一篇文章重点讨论了在 WebSphere® Studio Application Developer(以下简称 Application Developer)V4.03 中使用 JCE。本文将重点讨论在 Application Developer V5 中使用 JCE。Application Developer V5 的 Java 运行时环境(Java Runtime Environment,JRE)是 Java 2 SDK 1.3.x 级别的。因此,本文将重点讨论 JCE 1.2,它是 Java 2 SDK 1.2.x 和 Java 2 SDK 1.3.x 的可选包。
Application Developer V5 中包含了 WebSphere 运行时(WebSphere 测试环境,WebSphere Test Environment)V4 和 V5。WebSphere 测试环境 V4 和 V5 都包含了 Sun JCE 框架(Sun JCE Framework)1.2.1(ibmjcefw.jar)和 IBM JCE 提供程序(ibmjceprovider.jar)。IBM JCE 提供程序和 Sun JCE 提供程序很相似,但 IBM JCE 提供程序提供了更多的算法:
密码算法
签名算法
消息摘要算法
消息认证代码(MAC)
密钥一致算法
随机数生成算法
密钥存储(Key Store)
除了需要用相应的 JAR 文件来编译应用程序以外,当您在服务器端应用程序中使用 IBM JCE 提供程序时不需要进行任何配置。如果您想要使用其他 JCE 提供程序(比如 Sun JCE 提供程序),那么确实还需要进行其他配置。在 Application Developer Workbench JRE 的客户机端 Java 应用程序中使用 JCE 时,您会遇到一些限制。本文将为您解释:
Application Developer V5 中不同的 Java 运行时环境
如何在服务器端应用程序中使用 IBM JCE 和 Sun JCE
如何在单机 Java 应用程序中使用 IBM JCE 和 Sun JCE
Application Developer 中的 Java 运行时环境
在详细讨论如何配置 Application Developer 以进行 JCE 编程之前,多了解一些有关 Application Developer 附带的 JRE 会很有用。根据您所选择的安装选项,Application Developer 最多可附带四种 JRE 副本,它们全都是 1.3.x 级别的。要了解详细的 JRE 版本信息,请使用 java -version 命令。
第一种 JRE 位于 x:\Ws_installdir\eclipse\jre(其中 x:\Ws_installdir 是指安装 Application Developer 的驱动器和文件夹)。这个版本的 JRE 是用于 Application Developer Workbench(该工具本身)的,并且在缺省情况下用于单机客户机端 Java 应用程序(比如 Java 项目中的 GUI 应用程序)。尽管如此,您还是可以很容易地切换到另一种 JRE(比如用于客户机端 Java 应用程序的 WebSphere 运行时 JRE)。这个 Application Developer Workbench JRE 的版本是 J2RE 1.3.1,Windows_32 Build cn131-20020710。
重要信息:如果您想要把 JCE API 和这个 JRE 副本结合使用,那么安装 Application Developer 的文件夹(x:\Ws_installdir)就不能有空格。例如,您不能用缺省的安装文件夹(C:\Program File\IBM\WebSphere Studio)来安装 Application Developer。如果安装文件夹中存在空格,您将看到以下错误信息:
java.lang.ExceptionInInitializerError: java.lang.SecurityException: Cannot set up certs for trusted CAs
第二种 JRE 位于 x:\Ws_installdir\runtimes\base_v5\java\jre。这个版本的 JRE 用于遵循 J2EE 1.3 的 WebSphere Base Server V5 运行时,所有以 V5 平台为目标的服务器端组件(包括 servlet、JSP 和 EJB)都在这个版本的 JRE 上运行。这个 JRE 的版本是 J2RE 1.3.1,Windows 32 Build cn131-20021107。
第三种 JRE 位于 x:\Ws_installdir\runtimes\express_v5\java\jre。这个版本的 JRE 用于 WebSphere Express Server V5 运行时。如果您在安装过程中没有选择 WebSphere Express Server 运行时的选项,就可能没有 JRE 的这个副本。WebSphere Express Server 是 WebSphere Base Server 的子集,它没有 EJB 容器。这个 JRE 和 WebSphere Base Server 的 JRE 版本相同,也是 J2RE 1.3.1,Windows 32 Build cn131-20021107。
第四种 JRE 位于 x:\Ws_installdir\runtimes\aes_v4\java\jre。这个版本的 JRE 用于遵循 J2EE 1.2 的 WebSphere Advanced Edition Single Server V4 运行时,所有以 V4 平台为目标的服务器端组件(包括 servlet、JSP 和 EJB)都在这个版本的 JRE 上运行。如果您在安装过程中没有选择 V4 WebSphere 运行时的选项,就可能没有 JRE 的这个副本。这个 JRE 的版本是 J2RE 1.3.1,Windows 32 Build cn131w-20020710 ORB130。
接下来,您需要决定让自己的应用程序使用哪个 JCE 提供程序,还需决定是在单机客户机端 Java 应用程序中使用 JCE,还是在服务器端组件中使用 JCE。如果是在服务器端组件中使用 JCE,您还要决定这些组件以哪个平台为目标,这样就可以知道如何配置相应 JRE 中的 java.policy 和 java.security 文件,我们将在下面的部分中描述这个问题。
WebSphere 运行时中的 IBM JCE 支持
我们在“引言”中已经指出,WebSphere 运行时有一个内建的 Sun JCE 1.2.1 框架和一个 IBM JCE 服务提供程序,后者和 Sun JCE 服务提供程序很相似,但提供了更多的算法。Sun JCE 1.2.1 框架的 JAR 文件的位置是 x:\wte_jre_installdir\lib\ext\ibmjcefw.jar,而 IBM JCE 服务提供程序的 JAR 文件的位置则是 x:\wte_jre_installdir\lib\ext\ibmjceprovider.jar,其中 x:\wte_jre_installdir 可以是:
x:\Ws_installdir\runtimes\base_v5\java\jre,或
x:\Ws_installdir\runtimes\express_v5\java\jre,或
x:\Ws_installdir\runtimes\aes_v4\java\jre,
这取决于您的应用程序以哪个平台为目标。
如果您打开 x:\wte_jre_installdir\lib\security 中的 java.security 文件,就可以看到 IBM JCE 服务提供程序已被注册为服务提供程序之一,如下所示:
security.provider.1=sun.security.provider.Sun
security.provider.2=com.ibm.crypto.provider.IBMJCE
security.provider.3=com.ibm.jsse.IBMJSSEProvider
security.provider.4=com.ibm.security.cert.IBMCertPath
security.provider.5=com.ibm.crypto.pkcs11.provider.IBMPKCS11
而如果您打开 x:\wte_jre_installdir\lib\security 中的 java.policy 文件,就可以看到 ibmjcefw.jar 和 ibmjceprovider.jar 均拥有所有安全性权限,如下所示:
grant codeBase "file:${java.home}/lib/ext/*" {
permission java.security.AllPermission;
};
这样,您就可以在自己的服务器端组件中无缝地使用 IBM JCE 服务提供程序附带的 JCE API。而您只要把 ibmjcefw.jar 和 ibmjceprovider.jar 包含到项目的构建路径中就可以了。
在 WebSphere 运行时中使用 Sun JCE 提供程序
按照下面这些步骤来配置 Application Developer 中的 WebSphere 运行时以使用 Sun JCE 提供程序。因为 WebSphere 运行时的 JRE 中已经包含了 Sun JCE 1.2.1 框架,所以最好(出于兼容性考虑)是使用 Sun JCE 1.2.1 下载包所带的 Sun JCE 提供程序。在这部分中,x:\wte_jre_installdir 就是前面那部分所讨论的那个 WebSphere 运行时的 JRE 安装文件夹。
下载 Sun JCE。
解压缩下载的文件。这样将创建一个名为 X:\Sun_JCE_dir 的目录,该目录有两个子目录 doc 和 lib。lib 子目录中包含了 JCE 框架(例如 jce1_2_1.jar)和 Sun JCE 提供程序(sunjce_provider.jar)。lib 子目录中还包含用作权限策略文件的 JAR 文件:US_export_policy.jar 和 local_policy.jar。
授权给 sunjce_provider.jar。您应该授予 Sun JCE 提供程序下列权限(如果您使用的是其他供应商的实现,也要将下列权限授予这些 JCE 提供程序):
java.io.FilePermission,用于读取 sunjce_provider.jar 文件
java.lang.RuntimePermission,用于获取类保护域
java.security.SecurityPermission,用于设置提供程序属性
请编辑 x:\wte_jre_installdir\lib\security 中的 java.policy 文件并添加下面这个语句:
grant codeBase "file:///X:\Sun_JCE_dir\lib\sunjce_provider.jar" {
permission java.io.FilePermission
"X:\Sun_JCE_dir\lib\sunjce_provider.jar", "read";
permission java.lang.RuntimePermission
"getProtectionDomain";
permission java.security.SecurityPermission
"putProviderProperty.SunJCE";
};
x:\wte_jre_installdir\lib\ext 中所有 JAR 文件均被授予了 java.security.AllPermission。因此,如果您把 sunjce_provider.jar 复制到 x:\wte_jre_installdir\lib\ext 中,就可以跳过第 3 步。因为您将使用内建的 JCE 框架,所以不需要把权限授予 jce1_2_1.jar。
注册 Sun JCE 提供程序,您可以静态地注册,也可以动态地注册:
静态注册
通过编辑 x:\wte_jre_installdir\lib\security\ 中的安全性属性文件 java.security 把 Sun JCE 提供程序添加到您的已批准提供程序列表中。对于将被静态地注册的每个提供程序,java.security 文件都应该有一条相应的语句。每条这样的语句都会声明一个提供程序并指定其优先级 n,这个优先级是指在没有特定的提供程序被请求时,搜索各个提供程序以找到所请求的算法的顺序。优先级 1 的优先级最高,其次是 2,依此类推。
WebSphere 测试环境的 JRE 中预配置了下面这五种静态提供程序:
security.provider.1=sun.security.provider.Sun
security.provider.2=com.ibm.crypto.provider.IBMJCE
security.provider.3=com.ibm.jsse.IBMJSSEProvider
security.provider.4=com.ibm.security.cert.IBMCertPath
security.provider.5=com.ibm.crypto.pkcs11.provider.IBMPKCS11
这五种安全性提供程序可能已经实现了您需要的算法。因此,您可能不需要其他安全性提供程序为您的应用程序提供安全性了。这五种安全性提供程序是 WebSphere 运行时所必需的。切勿替换或除去这五行,否则 WebSphere 运行时就可能无法正确启动。
要配置其他提供程序,请在这五个安全性提供程序下面用正确的格式添加其他的代码行,用您从提供程序供应商处获得的全限定主类名(master class name)代替类名,并输入您想赋予该提供程序的优先级。例如,要把 Sun JCE 配置为优先级是 6 的提供程序,可在 java.security 文件中 Sun JCE 提供程序那行代码的后面添加下面这行代码:
security.provider.6=com.sun.crypto.provider.SunJCE
动态注册
要动态地注册 Sun JCE 提供程序,请在您程序的开头处添加下列代码行:
Security.addProvider(
new com.sun.crypto.provider.SunJCE());
上面的代码将把 Sun JCE 提供程序添加为安全性注册表内最后一个被批准的安全性提供程序。因为不同提供程序可能会实现相同的算法,所以如果 Sun JCE 提供程序的优先级最低,并且当没有特定的提供程序被请求时,就不可能选中 Sun JCE 提供程序作为其他提供程序也能实现的算法的服务提供程序。因此,您可能想通过使用下面的代码来添加 Sun JCE 提供程序,使其成为已批准提供程序列表中的第一位:
Security.insertProviderAt(
new com.sun.crypto.provider.SunJCE(),1);
在单机 Java 应用程序中使用 IBM JCE 提供程序
单机 Java 应用程序的缺省 JRE 中没有预配置 IBM JCE 提供程序。您可以将 IBM JCE 提供程序配置为单机 Java 应用程序的缺省 JRE,也可以为单机 Java 应用程序选择 WebSphere 运行时 JRE 以避免做进一步配置。
按照下面这些步骤为单机 Java 应用程序选择 WebSphere 运行时 JRE:
打开 Java 透视图并从菜单中选择 Run => Run。
从 Launch configurations 窗口中选择 Java Application。
单击 New 创建新配置。
为新配置取名,比如 JCETest。
在 Main 选项卡中选择 Java 应用程序的项目和主类名。
切换到 JRE 选项卡,并且从下拉列表中选择一个 WebSphere 运行时 JRE,如下图 1 所示。
单击 Apply 使配置立即生效。
单击 Run 运行 Java 应用程序。
图 1. 改变单机应用程序的 JRE
在单机 Java 应用程序中使用 Sun JCE 提供程序
因为 Java 应用程序的缺省 JRE 中包含 JCE 框架,所以您可以下载使用任何版本的 Sun JCE。在这部分中,我们将使用 Sun JCE 1.2.2,并且 x:\Ws_installdir\eclipse\jre 代表 JRE 安装目录,就像我们在前面部分中讨论的那样。按照下面这些步骤来配置单机 Java 应用程序的 Sun JCE 提供程序。如果您把 jce_1_2_2.jar 和 sunjce_provider.jar 复制到 x:\Ws_installdir\eclipse\jre\lib\ext 中,就可以跳过其中的第 4 步和第 5 步。
请确保 Application Developer 的安装文件夹没有空格,就像在标题为 Application Developer 中的 Java 运行时环境部分中描述的那样。
下载 JCE 1.2.2。
解压缩下载的文件 jce-1_2_2.zip。这样将创建一个名为 JCE1.2.2 的目录,该目录带有两个子目录 doc 和 lib。本文假定该目录的完整路径是 D:\JCE1.2.2。lib 子目录包含 jce1_2_2.jar 和 sunjce_provider.jar。lib 子目录还包含用作权限策略文件的 JAR 文件:US_export_policy.jar 和 local_policy.jar。
授权给 jce1_2_2.jar。把 java.security.AllPermission 授予 JCE 1.2.2 框架(jce1_2_2.jar)。请编辑 x:\Ws_installdir\eclipse\jre\lib\security 中的 java.policy 文件并添加下面的语句:
grant codeBase "file:///D:\JCE1.2.2\lib\jce1_2_2.jar" {
permission java.security.AllPermission;
};
授权给 sunjce_provider.jar。您应该授予 Sun JCE 提供程序下列权限(如果您使用的是其他供应商的实现,也要将下列权限授予这些 JCE 提供程序):
java.io.FilePermission,用于读取 sunjce_provider.jar 文件
java.lang.RuntimePermission,用于获取类保护域
java.security.SecurityPermission,用于设置提供程序属性
请编辑 x:\Ws_installdir\eclipse\jre\lib\security 中的 java.policy 文件并添加下面的语句:
grant codeBase "file:///D:\JCE1.2.2\lib\sunjce_provider.jar" {
permission java.io.FilePermission
"D:\JCE1.2.2\lib\sunjce_provider.jar", "read";
permission java.lang.RuntimePermission
"getProtectionDomain";
permission java.security.SecurityPermission
"putProviderProperty.SunJCE";
};
注册 Sun JCE 提供程序,您可以静态地注册,也可以动态地注册:
静态注册
通过编辑 x:\Ws_installdir\eclipse\jre\lib\security\ 中的安全性属性文件 java.security 把 Sun JCE 提供程序添加到您的已批准提供程序列表中。对于将被静态地注册的每个提供程序,java.security 文件都应该有一条相应的语句。每条这样的语句声明一个提供程序并指定其优先级 n,这个优先级是指在没有特定的提供程序被请求时,搜索各个提供程序以找到所请求的算法的顺序。优先级 1 的优先级最高,其次是 2,依此类推。
在单机/客户机端应用程序的 JRE 中,已经把 Sun 和 IBMJCA 配置为静态提供程序:
security.provider.1=sun.security.provider.Sun
security.provider.2=com.ibm.crypto.provider.IBMJCA
提供程序列表中不能除去 Sun。您可能想要通过在 java.security 文件中添加下面这行代码来把 Sun JCE 配置为优先级是 3 的提供程序:
security.provider.3=com.sun.crypto.provider.SunJCE
动态注册
要动态地注册 Sun JCE 提供程序,请在您程序的开头处添加下列代码行:
Security.addProvider(
new com.sun.crypto.provider.SunJCE());
上面的代码将把 Sun JCE 提供程序添加为安全性注册表内最后一个被批准的安全性提供程序。因为不同提供程序可能会实现相同的算法,所以如果 Sun JCE 提供程序的优先级最低,并且当没有特定的提供程序被请求时,就不可能选中 Sun JCE 提供程序作为其他提供程序也能实现的算法的服务提供程序。因此,您可能想通过使用下面的代码来添加 Sun JCE 提供程序,使其成为已批准提供程序列表中的第一位:
Security.insertProviderAt(
new com.sun.crypto.provider.SunJCE(),1);
设置您项目的 Java 构建路径
您需要把 jce1_2_2.jar(或 ibmjcefw.jar)和 sunjce_provider.jar 添加到将使用 Sun JCE 提供程序的项目的 Java 构建路径(Java build path)中。您需要把 ibmjcefw.jar 和 ibmjceprovider.jar 添加到将使用 IBM JCE 提供程序的项目的 Java 构建路径中。如果您使用的是其他 JCE 提供程序而不是 Sun JCE 提供程序和 IBM JCE 提供程序,您还需要把那些 JCE 提供程序的 JAR 文件添加到 Java 构建路径中。要设置您项目的 Java 构建路径:
从 Navigator 视图右键单击该项目并选择 Properties。
在 Properties 对话框中,从左侧面板单击 Java build path,然后从右侧面板单击 Libraries。
从 Select JAR file 对话框中选择 Add External JARs。转到 D:\JCE1.2.2\lib\,然后选择 jce1_2_2.jar 和 sunjce_provider.jar。
单击 OK 关闭 Properties 对话框。
设置服务器实例的类路径
如果您在服务器端组件中使用的是 Sun JCE 提供程序,您还需要按下列步骤把 sunjce_provider.jar 添加到服务器实例的类路径中。因为 WebSphere 运行时 JRE 中已经包含了 Sun JCE 框架 1.2.1,所以您不需要把 Sun JCE 框架包含到服务器实例的类路径中。按照下面这些步骤把 sunjce_provider.jar 添加到服务器实例的类路径中:
打开 Server 透视图。在 Server Configuration 视图上双击您为单元测试定义的服务器实例。缺省的服务器实例名为 WebSphere Test Environment。
在该服务器实例的编辑器打开后,单击 Paths 选项卡。在 ws.ext.dirs 面板上单击 Add External JARS。
在 Select JAR file 对话框中,转到 D:\JCE1.2.2\lib\ 并选择 sunjce_provider.jar。
保存所作的改变。
运行样本代码
您可以下载样本代码(sample.zip)。这个样本代码使用的是 Sun JCE 提供程序的动态注册。sample.zip 文件包含两个文件:SampleTest.jar 和 jceweb.ear,其中前者是单机应用程序,而后者是企业应用程序压缩文档(enterprise application archive,EAR)文件。这个样本代码会生成一个新密钥,并用它对数据进行加密和解密。请记住,在测试样本代码之前,您需要修改 java.policy 文件。
使用 SampleTest.jar
创建一个 Java 项目并把 SampleTest.jar 导入到该项目中。
根据具体情况修改该项目的类路径。
打开 Java 透视图。单击 jce.test.SimpleTest.java。
选择 Run => Run。
从 Launch Configurations 窗口中选择 Java Application。
单击 New 创建一个新配置。
为新配置取名,例如 SimpleEncryptionTest。
您可以看到 Main 选项卡中已自动填入了 Project 和 Main class 信息。如果在第 4 步之前您还没有单击过 jce.test.SimpleTest.java,那么您就需要手动填入这些信息。
切换到 Arguments 选项卡并输入 -e HelloWorld 作为程序参数。这样将用生成的密钥来加密字符串 HelloWorld。
单击 Apply 使配置立即生效。
单击 Run 运行 Java 应用程序。程序输出应该如下所示:
the encrypted data is:q5PzaXaKB0//0LMiGV2hLQ==
在您首次运行 jce.test.SimpleTest.java 时会生成一个密钥。这个密钥将被序列化为一个文件,并将随后被用来启动 jce.test.SimpleTest.java。因为密钥是动态生成的,所以如果启动 jce.test.SimpleTest.java 后您得到的已加密数据与上面的数据不同也很正常。
重复第 4 步至第 8 步创建一个名为 SimpleDecryptonTest 的新配置。在 Arguments 选项卡中输入 -d,然后输入您在第 11 步中获取的已加密字符串(比如 -d q5PzaXaKB0//0LMiGV2hLQ==)作为程序参数。
再次运行 jce.test.SimpleTest.java。输出将如下所示:
the decrypted data is: HelloWorld
您可能想要用其他数据(或许像在 Good Morning 中那样包含一个空格)代替 HelloWorld,并再次测试加密/解密算法。
使用 jceweb.ear
把 jceweb.ear 导入到工作空间,并用您想用的任意名称来命名企业项目。创建一个名为 JCEWeb 的 Web 项目。上述企业项目和 Web 项目都是遵循 J2EE 1.3 的。
根据具体情况改变该 Web 项目的 Java 构建路径。
创建一个 V5 服务器实例并从 Server 透视图配置它,并确保您已在该服务器实例的类路径中包含了 sunjce_provider.jar。
请确保关闭了服务器配置编辑器。把该企业项目添加到服务器配置中。
右键单击 Web 项目 JCEWeb 下的文件夹 Web Content 中的 JCETestBeanInputForm.html,然后选择 Run on server。您应该会看到浏览器被打开,出现如下所示的页面:
图 2
单击 Submit,您将看到如图 3 所示的输出。因为您是首次运行这个应用程序生成密钥,所以输出的数据可能和图 3 所示的数据有所不同。
图 3
在结果页面中,从组合框中选择 Decrypt,然后单击 Submit,如图 4 所示:
图 4
您将看到已加密的文本被解密为初始的文本,如图 5 所示:
图 5
您可能想用其他数据(或许像在 Good Morning 中那样包含一个空格)代替 HelloWorld,并再次测试服务器组件中的加密/解密算法。
欢迎光临 黑色海岸线论坛 (http://bbs.thysea.com/)
Powered by Discuz! 7.2