JavaSE 6基于JSR105的XML签名之实践篇
2008-01-05 08:26:33 来源:WEB开发网核心提示:在上篇(【理论篇】)中,我们分析了有关基于JSR-105进行xml签名的基本概念,JavaSE 6基于JSR105的XML签名之实践篇,在本篇中,我们开始分析一个实际的XML签名示例应用程序,我们可以轻易地得到PrivateKey和PublicKey-通过调用相应的操作getPrivate()和getPublic()实
在上篇(【理论篇】)中,我们分析了有关基于JSR-105进行xml签名的基本概念。在本篇中,我们开始分析一个实际的XML签名示例应用程序。
一、 密码学密钥和证书
现在,我们已经预备好我们的XML签名示例应用程序。
让我们首先分析下列XML文档-./etc/invoice.xml:
<?XML version="1.0" encoding="UTF-8" standalone="no"?>
<invoice XMLns="http://www.company.com/accounting">
<items>
<item>
<desc>Applied Cryptography</desc>
<type>book</type>
<unitPRice>44.50</unitprice>
<quantity>1</quantity>
</item>
</items>
<creditcard>
<number>123456789</number>
<eXPiry>10/20/2009</expiry>
<lastname>John</lastname>
<firstname>Smith</firstname>
</creditcard>
</invoice>
我们计划使用一个XML签名对它进行签名并且希望使用一个基于一个公共密钥的签名方法。
让我们先生成密码学密钥。为此,我们可以使用JDK中提供的keytool工具-把该程序移动到./etc文件夹下,并且执行下列命令:
keytool -genkey -keysize 512 -sigalg DSA -dname "cn=Young Yang, ou=Architecture, o=Company, L=New York, ST=NY, c=US" -alias biz -keypass kp1234 -keystore bizkeystore -storepass sp1234 -validity 180
这个命令能够创建密钥并预以存储-名字为bizkeystore,存储在工作目录./etc下,并且指定它的口令为sp1234。它还生成一个针对实体(它包含有一个卓著的名字-Young Yang)的公有/私有密钥对。【注重】,这里使用DSA密钥生成算法来创建公有/私有密钥-都为512位长。
上面的命令进一步创建了一个自签名的证书,这是使用SHA1的DSA算法(JSR-105注释中的DSA_SHA1,其中包括了公共密钥和前面那个卓闻名字信息)实现的。这个证书将保持180天的有效期并且关联与一个密钥存储文件(此处引用的别名为"biz")中的私有密钥。该私有密钥被赋予口令kp1234。
我们的示例中包括一个简单的java类-KeyStoreInfo,用于把存储于前面的密钥存储文件中的密钥和证书信息输出到System.out;这个类也用于应用程序从中取得密钥对-这里的私有和公共密钥匹配作为输入参数指定的条件。为了试验它能够输出包含在前面存储文件bizkeystore中的信息,读者可以运行Ant目标ksInfo。
下列代码片断显示KeyStoreInfo中的用来检索一个KeyPair的方法:
public static KeyPair getKeyPair(String store,String sPass,String kPass,String alias)
throws CertificateException,
IOException,
UnrecoverableKeyException,
KeyStoreException,
NoSUChAlgorithmException{
KeyStore ks = loadKeyStore(store,sPass);
KeyPair keyPair = null;
Key key = null;
PublicKey publicKey = null;
PrivateKey privateKey = null;
if (ks.containsAlias(alias)){
key = ks.getKey(alias,kPass.toCharArray());
if (key instanceof PrivateKey){
Certificate cert = ks.getCertificate(alias);
publicKey = cert.getPublicKey();
privateKey = (PrivateKey)key;
return new KeyPair(publicKey,privateKey);
}else{
return null;
}
} else {
return null;
}
}
借助于一个KeyPair,我们可以轻易地得到PrivateKey和PublicKey-通过调用相应的操作getPrivate()和getPublic()实现。
为了从KeyStore中得到一个PublicKey,我们并不真正需要在上面的方法中所要求的密钥口令,而这正是下列方法所实现的:
- ››基于IP地址的vsftp服务器
- ››基于MySQL 水平分区的优化示例
- ››基于CentOS5的Linux下pptp和openvpn的搭建及配置
- ››JSR 303 - Bean Validation 介绍及最佳实践
- ››基于JavaScript的网页版塔防游戏
- ››基于Android平台 QQ大战360手机游戏爆红
- ››基于Windows Azure的云计算应用设计
- ››基于AES算法实现对数据的加密
- ››基于SoPC目标板Flash编程设计的创建及应用
- ››基于SolidWarks齿轮机构的运动分析与仿真
- ››基于Windwos Server 2008故障转移群
- ››基于JavaScript的REST客户端框架
更多精彩
赞助商链接