JavaSE 6基于JSR105的XML簽名之實踐篇

發表于:2007-04-27來源:作者:點擊數: 標簽:實踐xmlJavaSEJSR105簽名
在 上篇(【理論篇】) 中,我們分析了有關基于JSR-105進行XML簽名的基本概念。在本篇中,我們開始分析一個實際的XML簽名示例應用程序。 一、 密碼學密鑰和證書 現在,我們已經準備好我們的XML簽名示例應用程序。 讓我們首先分析下列XML文檔-./etc/invoice.x
  在上篇(【理論篇】)中,我們分析了有關基于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>
?。糹tem>
 ?。糳esc>Applied Cryptography</desc>
 ?。紅ype>book</type>
 ?。紆nitprice>44.50</unitprice>
 ?。紂uantity>1</quantity>
?。?item>
</items>
<creditcard>
?。糿umber>123456789</number>
?。糴xpiry>10/20/2009</expiry>
?。糽astname>John</lastname>
?。糵irstname>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,我們并不真正需要在上面的方法中所要求的密鑰口令,而這正是下列方法所實現的:

public static PublicKey getPublicKey(String store,
String sPass, String alias)
throws KeyStoreException,
NoSuchAlgorithmException,
CertificateException,
IOException{
 KeyStore ks = loadKeyStore(store, sPass);
 Certificate cert = ks.getCertificate(alias);
 return cert.getPublicKey();
}

  在上面兩部分代碼片斷中,方法KeyStore loadKeyStore(String store,String sPass)是一個工具函數,用于實例化一個KeyStore對象,并且從文件系統加載入口。我們以如下方式實現它:

private static KeyStore loadKeyStore(String store, String sPass)
throws KeyStoreException,
NoSuchAlgorithmException,
CertificateException,
IOException{
 KeyStore myKS = KeyStore.getInstance("JKS");
 FileInputStream fis = new FileInputStream(store);
 myKS.load(fis,sPass.toCharArray());
 fis.close();
 return myKS;
}

  伴隨JDK提供的keytool還可以把存儲在一個密鑰儲存文件內的證書輸出到系統文件中。例如,為了創建一個包含X509證書(關聯于別名為biz的密鑰入口)的biz.cer文件,我們可以從文件夾./etcdirectory下運行下列命令:

keytool -export -alias biz -file biz.cer -keystore bizkeystore -storepass sp1234

  這個證書實現認證我們討論上面的公共密鑰。

  我們還在示例中包括了一個Java類-CertificateInfo,用于把一個證書中的一些有趣的信息輸出到System.out。為了試驗這一點,讀者可以運行Ant目標certInfo。然而,要理解該代碼及其輸出,必須具有DSA和RSA算法的基本知識。當然,讀者可以安全地繞過這個程序而繼續閱讀本文后面的內容。

共6頁。 1 2 3 4 5 6 :

原文轉自:http://www.anti-gravitydesign.com

評論列表(網友評論僅供網友表達個人看法,并不表明本站同意其觀點或證實其描述)
...
国产97人人超碰caoprom_尤物国产在线一区手机播放_精品国产一区二区三_色天使久久综合给合久久97