亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 開發 > Java > 正文

詳解Java數字簽名提供XML安全

2024-07-14 08:42:07
字體:
來源:轉載
供稿:網友

用Java數字簽名提供XML安全

眾所周知,XML在產品和項目開發中起著非常重要的作用。通過XML文檔可以獲取很多信息,還可以使用XML文件進行CRUD(增加、查詢、更新和 刪除)操作。然而值得注意的是,我們如何確保XML中的數據是來自經過認證的可信和可靠的來源。關于XML文件數據的可靠性和真實性存在很多問題。通常的 情況是,開發者直接處理XML文件而不去考慮數據的可靠性。有一些情況提出了上面的所有問題?,F實生活中,每當我們從郵局收到一封信件時我們如何確定這封 信是來自我們的朋友?依據可能是他/她的習慣用語、用詞或者郵件詳細地址。也可能是他/她的個性簽名。如今,我們收到的信件可能被某人進行了篡改,添加了 其他內容?;谏鲜鲈?,通常我們會驗證朋友的手寫簽名。當然這些是關于來自郵局的普通郵件。電子消息又該如何?我們如何驗證電子消息的真實性?這種情況 我們會采用數字簽名。本文會對保證數據完整性的XML數字簽名技術進行簡要介紹,并且展示如何為XML文件附加電子簽名及其驗證過程。

使用的技術

過去幾年里,XML數字簽名取得了快速發展,在金融領域尤其如此。在開始討論之前,讓我們考慮一個典型場景:想象一下,某個組織將所有雇員的薪資內 容用XML文件發送給所得稅部門。那么現在的問題是:所得稅部門如何驗證這份XML文件?這就是說,IT部門需要驗證該組織的敏感信息。IT部門需要確保 XML文件的來源可信,并且在IT部門收到之前沒有經過篡改——也就是說文檔的內容沒有在傳遞中被修改。首先,我們需要理解數字簽名的概念。數字簽名是一 種用來驗證文檔發自可信方的電子簽名。它確保了文檔的原始內容在傳輸中沒有受到修改。數字簽名可以用于任何加密和非加密消息,因此接收方可以識別發送者的 身份,并確認消息沒有被其他人修改。根據維基百科的定義:“數字簽名是一種驗證數字信息或文檔的數學方法”。一個有效的數字簽名可以讓接收者確認收到的消 息來自已知發送方,發送者不能否認自己發送了此消息(提供認證和不可否認性)并且此消息在傳輸中未經修改(提供完整性)。數字簽名通常被用在軟件發布、金 融事務和其他需要檢測偽造或篡改的重要場合。

下面讓我們來看完整的一個帶有數字簽名的XML文件:

<?xml version="1.0" encoding="UTF-8" standalone="no"?><SalaryDeposit>   <Organisation>     <Name>DDLab Inc</Name>     <AccountNo>SBC-12345789</AccountNo>   </Organisation>   <Employees>     <Emp>       <Name>John Abraham</Name>       <AccountNo>SB-001</AccountNo>       <Amount>1234</Amount>     </Emp>     <Emp>       <Name>Bipasha Basu</Name>       <AccountNo>SB-002</AccountNo>       <Amount>2334</Amount>     </Emp>     <Emp>       <Name>Vidya Balan</Name>       <AccountNo>SB-003</AccountNo>       <Amount>3465</Amount>     </Emp>     <Emp>       <Name>Debadatta Mishra</Name>       <AccountNo>SB-007</AccountNo>       <Amount>5789</Amount>     </Emp>     <Emp>       <Name>Priti Zinta</Name>       <AccountNo>SB-009</AccountNo>       <Amount>1234</Amount>     </Emp>   </Employees>   <Signature xmlns="http://www.w3.org/2000/09/xmldsig#">     <SignedInfo>       <CanonicalizationMethod Algorithm="http://www.w3.org/TR/2001/REC-xml-c14n-20010315"/>       <SignatureMethod Algorithm="http://www.w3.org/2000/09/xmldsig#rsa-sha1"/>       <Reference URI="">        <Transforms>          <Transform Algorithm="http://www.w3.org/2000/09/xmldsig#enveloped-signature"/>        </Transforms>        <DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha1"/>        <DigestValue>bHS+6uf8KbJV4AGzoHNHLfnXvKM=</DigestValue>       </Reference>     </SignedInfo>     <SignatureValue> aUEMrCT5dzeOfSNaznzoT0If8WZ8KQcMNXDqtoeseonVk3NqOk9ctcxrf3QVX3wP6810DDRPdI6l    e8ccG64Ge0HjkO+aYC5+c2L/qKBzwtSbl/olJEuFU2DVxBQO+K29TTUJfxpVzC9Zf2pvT+1NRj0f    2/ofHujYZ01D6+YqI8c=     </SignatureValue>     <KeyInfo>       <KeyValue>        <RSAKeyValue>          <Modulus> jfAd5uV38L36+lDZJrqfH9oLN86VJezXYfAeU+lrFoHlKAXVJLAi9hKvBHQRer4tPfdez6iSBKsl       6IHkPnVRAKt0xU99uxi5QpymsWAX3qnBqHlw9Z70PwyZ+Xysfw4Q2tK2HtSgUOhMuaUcIf9sbHvf       gbvcRPgxDZZqfIzDmDU=</Modulus>          <Exponent>AQAB</Exponent>        </RSAKeyValue>       </KeyValue>     </KeyInfo>   </Signature> </SalaryDeposit> 

上面是一個帶有簽名的XML文件,該文件可以隨時進行驗證。文件中包了含雇員名稱、帳號和薪資信息。然而,實際的數字簽名通 過<Signature></Signature>標記進行附加。<Signature> 標記中的信息提供了文檔的真實性。正如你看到的那樣,雖然你可以隨意修改其中的數據,但是這種修改會在隨后的簽名驗證中被查到。
基本上數字簽名有三種類型:

  1. 封內簽名
  2. 封外簽名
  3. 分離簽名

封內簽名

這種簽名是將簽名作為XML對象的子信息,也就是說 <Signature>是郵件中XML文件的子標簽。封內數字簽名的結構如下:

<RootElement>  <Signature>  ……  </Signature> </ RootElement> 

本文會介紹如何創建XML封內數字簽名。

封外簽名

這種簽名將XML文檔包含到Signature對象,也就是說<Signature>標簽是簽名XML文件的根元素。封外簽名結構如下:

<Signature >   < MyXMLDocument >   ……   </ MyXMLDocument > </Signature> 

分離簽名

這種情況下,簽名是獨立生成的不作為XML的一部分。也就是說你會擁有兩個XML文件:一個待簽名的XML文件,另一個是XML簽名。下面是分離簽名的XML結構:

<Signature> …… </Signature> 

XML數字簽名文件結構如下:

<Signature xmlns="">   <SignedInfo>     <CanonicalizationMethod Algorithm="" />     <SignatureMethod Algorithm="" />     <Reference URI="">       <Transforms>         <Transform Algorithm="" />         </Transforms>       <DigestMethod Algorithm="" />       <DigestValue></DigestValue>     </Reference>   </SignedInfo>   <SignatureValue></SignatureValue>   <KeyInfo>     <KeyValue>       <RSAKeyValue>         <Modulus></Modulus>         <Exponent></Exponent>       </RSAKeyValue>     </KeyValue>   </KeyInfo> </Signature> 

XML中<Signature>有3個子標簽,結構如下:

<Signature>   <SignedInfo></SignedInfo>   <SignatureValue></SignatureValue>   <KeyInfo></KeyInfo> </Signature> 

這里<Signature>是XML數字簽名的根元素,這一點由W3C建議并且必須遵守。<SignedInfo>元素是你的簽名信息;<SignatureValue>包含了實際的簽名以及使用Base64加密的內容;最后<KeyInfo>表示公鑰。讓我們再看一下<SignedInfo>標簽,結構如下:

<SignedInfo>   <CanonicalizationMethod Algorithm="http://www.w3.org/TR/2001/REC-xml-c14n-20010315"/>   <SignatureMethod Algorithm="http://www.w3.org/2000/09/xmldsig#rsa-sha1"/>   <Reference URI="">     <Transforms>       <Transform Algorithm="http://www.w3.org/2000/09/xmldsig#enveloped-signature"/>     </Transforms>     <DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha1"/>     <DigestValue>bHS+6uf8KbJV4AGzoHNHLfnXvKM=</DigestValue>   </Reference> </SignedInfo> 

當使用Java創建XML數字簽名時,SignedInfo對象被用來在數字簽名的Signature標簽內創建元素。這也是W3C建議的XML簽名標準中的一部分。

XML標簽<KeyInfo>的結構如下:

<KeyInfo>   <KeyValue>     <RSAKeyValue>       <Modulus></Modulus>       <Exponent></Exponent>     </RSAKeyValue>   </KeyValue> </KeyInfo> 

KeyInfo>標記包含了需要數學計算的相關信息,主要有公鑰的系數和指數。
要創建XML數字簽名可以遵循下列步驟:

  1. 生成一組私鑰和公鑰。
  2. 獲得原始XML文件。
  3. 通過Java API使用私鑰和公鑰為原始的XML文件簽名,生成帶有XML簽名的文檔。

讓我們看看使用Java生成XML簽名的相關代碼:

public void generateXMLDigitalSignature(String originalXmlFilePath, String destnSignedXmlFilePath, String privateKeyFilePath, String publicKeyFilePath) {   // 獲取XML文檔對象   Document doc = getXmlDocument(originalXmlFilePath);     // 創建XML簽名工廠   XMLSignatureFactory xmlSigFactory = XMLSignatureFactory.getInstance("DOM");   PrivateKey privateKey = new KryptoUtil().getStoredPrivateKey(privateKeyFilePath);   DOMSignContext domSignCtx = new DOMSignContext(privateKey, doc.getDocumentElement());   Reference ref = null;   SignedInfo signedInfo = null;   try {     ref = xmlSigFactory.newReference("", xmlSigFactory.newDigestMethod(DigestMethod.SHA1, null),     Collections.singletonList(xmlSigFactory.newTransform(Transform.ENVELOPED,     (TransformParameterSpec) null)), null, null);     signedInfo = xmlSigFactory.newSignedInfo(     xmlSigFactory.newCanonicalizationMethod(CanonicalizationMethod.INCLUSIVE,     (C14NMethodParameterSpec) null),     xmlSigFactory.newSignatureMethod(SignatureMethod.RSA_SHA1, null),     Collections.singletonList(ref));   } catch (NoSuchAlgorithmException ex) {     ex.printStackTrace();   } catch (InvalidAlgorithmParameterException ex) {     ex.printStackTrace();   }     // 傳入公鑰路徑   KeyInfo keyInfo = getKeyInfo(xmlSigFactory, publicKeyFilePath);     // 創建新的XML簽名   XMLSignature xmlSignature = xmlSigFactory.newXMLSignature(signedInfo, keyInfo);   try {     // 對文檔簽名     xmlSignature.sign(domSignCtx);   } catch (MarshalException ex) {     ex.printStackTrace();   } catch (XMLSignatureException ex) {     ex.printStackTrace();   }     // 存儲簽名過的文檔   storeSignedDoc(doc, destnSignedXmlFilePath); } 

XML簽名驗證

數字簽名的驗證包含以下操作:

驗證數字簽名

  • 計算<SignedInfo>元素摘要。
  • 使用公鑰解密<SignatureValue>元素。
  • 比較上面兩個值。
  • 計算引用摘要
  • 重新計算<SignedInfo>元素引用摘要。
  • 將它們與<DigestValue>中的摘要比較。

為了驗證XML簽名文檔,需要完成下列步驟

  1. 得到XML文檔和公鑰。
  2. 驗證<SignedInfo> 元素的數字簽名。
  3. 計算<SignedInfo> 元素的摘要并對值進行比較。

讓我們看看下面這段XML數字簽名示例代碼:

public static boolean isXmlDigitalSignatureValid(String signedXmlFilePath, String pubicKeyFilePath) throws Exception {   boolean validFlag = false;   Document doc = getXmlDocument(signedXmlFilePath);   NodeList nl = doc.getElementsByTagNameNS(XMLSignature.XMLNS, "Signature");   if (nl.getLength() == 0) {     throw new Exception("No XML Digital Signature Found, document is discarded");   }     PublicKey publicKey = new KryptoUtil().getStoredPublicKey(pubicKeyFilePath);   DOMValidateContext valContext = new DOMValidateContext(publicKey, nl.item(0));   XMLSignatureFactory fac = XMLSignatureFactory.getInstance("DOM");   XMLSignature signature = fac.unmarshalXMLSignature(valContext);   validFlag = signature.validate(valContext);   return validFlag; } 

如上面示例代碼所示,XML簽名可以通過重新計算<SignedInfo>的摘要值進行驗證,驗證算法由 <SignatureMethod>元素指定;使用公鑰可以驗證<SignedInfo>摘要中 的<SignatureValue>值是否正確。 引用摘要會在<SignedInfo>元素中重新計算,并與<Reference> 元素中對應的<DigestValue> 進行比對。接下來,讓我們熟悉一下XML數字簽名相關的Java組件。

XMLSignatureFactory

XMLSignatureFactory是生成XML文檔數字簽名的工廠對象。對象的創建如下列代碼所示:

XMLSignatureFactory factory = XMLSignatureFactory.getInstance("DOM"); 

DOMSignContext

DOMSignContext對象用來生成DOM樹。在創建數字簽名的過程中,DOM樹會被附上XML數字簽名。DOMSignContext對象要求輸入私鑰和XML文檔的根元素。

Reference

Reference對象用來在Signature 標記的SignedInfo內部創建XML數字簽名。對象創建的遵循“W3C XML簽名文法和處理”規則。Reference的基本結構如下:

<Reference URI="">   <Transforms>   <Transform Algorithm="http://www.w3.org/2000/09/xmldsig#enveloped-signature"/>   </Transforms>   <DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha1"/>   <DigestValue>bHS+6uf8KbJV4AGzoHNHLfnXvKM=</DigestValue> </Reference> 

SignedInfo

類似的,SignedInfo對象可以在數字簽名的Signature標記內部創建元素。創建的規則同樣遵循“W3C XML數字簽名協議”。SignedInfo的基本結構如下:

<SignedInfo>   <CanonicalizationMethod Algorithm="http://www.w3.org/TR/2001/REC-xml-c14n-20010315"/>   <SignatureMethod Algorithm="http://www.w3.org/2000/09/xmldsig#rsa-sha1"/>   <Reference URI="">     <Transforms>     <Transform Algorithm="http://www.w3.org/2000/09/xmldsig#enveloped-signature"/>     </Transforms>     <DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha1"/>     <DigestValue>bHS+6uf8KbJV4AGzoHNHLfnXvKM=</DigestValue>   </Reference> </SignedInfo> 

XMLSignature

最后,XMLSignature對象用來創建XML文檔的封面簽名。按照W3C的建議,簽名對象應該作為XML數字簽名的根元素。
完整的結構如下:

<Signature xmlns="http://www.w3.org/2000/09/xmldsig#">   <SignedInfo>     <CanonicalizationMethod Algorithm="http://www.w3.org/TR/2001/REC-xml-c14n-20010315"/>     <SignatureMethod Algorithm="http://www.w3.org/2000/09/xmldsig#rsa-sha1"/>     <Reference URI="">       <Transforms>       <Transform Algorithm="http://www.w3.org/2000/09/xmldsig#enveloped-signature"/>       </Transforms>       <DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha1"/>       <DigestValue>bHS+6uf8KbJV4AGzoHNHLfnXvKM=</DigestValue>     </Reference>   </SignedInfo>   <SignatureValue>aUEMrCT5dzeOfSNaznzoT0If8WZ8KQcMNXDqtoeseonVk3NqOk9ctcxrf3QVX3wP6810DDRPdI6l   e8ccG64Ge0HjkO+aYC5+c2L/qKBzwtSbl/olJEuFU2DVxBQO+K29TTUJfxpVzC9Zf2pvT+1NRj0f   2/ofHujYZ01D6+YqI8c=</SignatureValue>   <KeyInfo>     <KeyValue>     <RSAKeyValue>       <Modulus>jfAd5uV38L36+lDZJrqfH9oLN86VJezXYfAeU+lrFoHlKAXVJLAi9hKvBHQRer4tPfdez6iSBKsl       6IHkPnVRAKt0xU99uxi5QpymsWAX3qnBqHlw9Z70PwyZ+Xysfw4Q2tK2HtSgUOhMuaUcIf9sbHvf       gbvcRPgxDZZqfIzDmDU=</Modulus>       <Exponent>AQAB</Exponent>     </RSAKeyValue>     </KeyValue>   </KeyInfo> </Signature> 

為了有一個完成的理解,可以從這里下載完整的Netbeans項目代碼。

可以用你最喜歡的Java IDE對項目進行配置;也可以在source文件夾下運行程序。這個項目已經包含了公鑰和私鑰。如果想要自己生成,可以運行 “TestGenerateKeys”類生成一對公鑰和私鑰。通過指定自己的XMI文件,還可以查看XML簽名的生成過程。

以上就是本次我們給大家整理的內容的全部,感謝大家對VeVb武林網的支持,如果大家還有不明白的可以在下方留言區討論。


注:相關教程知識閱讀請移步到JAVA教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
久久精品国产v日韩v亚洲| 欧美色videos| 日韩高清电影免费观看完整版| 夜夜嗨av一区二区三区四区| 中文字幕日韩欧美在线视频| 亚洲第一天堂无码专区| 欧美日韩在线观看视频小说| 国产日韩欧美自拍| 性色av一区二区咪爱| 亚洲国产精品久久久久秋霞蜜臀| 26uuu亚洲国产精品| 国产精品久久久久免费a∨| 91色琪琪电影亚洲精品久久| 一区二区三区精品99久久| 米奇精品一区二区三区在线观看| 日韩亚洲精品电影| 国内精品免费午夜毛片| 欧美成人免费在线视频| 在线视频欧美性高潮| 亚洲一级黄色片| 日韩亚洲精品电影| 国产精品一二三视频| 国产精品高潮呻吟久久av黑人| 欧美精品video| 在线播放精品一区二区三区| 精品成人av一区| 在线日韩中文字幕| 欧美极品美女视频网站在线观看免费| 国产a∨精品一区二区三区不卡| 精品色蜜蜜精品视频在线观看| 91精品啪在线观看麻豆免费| 这里只有精品在线播放| 日本久久中文字幕| 国产精自产拍久久久久久| 亚洲色图综合久久| 日韩乱码在线视频| 欧美成年人网站| 97免费中文视频在线观看| 日韩不卡在线观看| 亚洲欧美日韩国产精品| 久久精品小视频| 久久影视电视剧凤归四时歌| 亚洲一区二区三区四区在线播放| 精品美女久久久久久免费| 国产精品国产三级国产aⅴ9色| 日本精品免费观看| 精品日韩美女的视频高清| 疯狂做受xxxx欧美肥白少妇| 在线色欧美三级视频| 久热精品视频在线观看一区| 国产精品欧美一区二区三区奶水| 欧美xxxx18国产| 国产一区二区三区直播精品电影| 久久影院在线观看| 欧美成人精品xxx| 日韩欧美精品网站| 亚洲人成人99网站| 久久九九免费视频| 国产精品久久久久久久久久久新郎| 国产+人+亚洲| 国产成人精品在线播放| 91精品综合久久久久久五月天| 欧美日韩午夜剧场| 午夜精品久久久久久99热| 91久久精品美女| 欧美成人激情视频免费观看| 中文字幕在线视频日韩| 日韩毛片在线观看| 国产一区二区三区在线观看视频| 亚洲欧洲日韩国产| 亚洲最大福利网站| 91精品国产综合久久香蕉的用户体验| 91视频88av| 91九色精品视频| 一本大道香蕉久在线播放29| 色偷偷噜噜噜亚洲男人| 色婷婷综合久久久久| 欧美大成色www永久网站婷| 久久av资源网站| 欧美日本黄视频| 色噜噜狠狠色综合网图区| 国产精品第3页| 欧美黑人巨大精品一区二区| 91精品国产91久久久久久久久| 久久久久女教师免费一区| 亚洲美女av黄| 青草青草久热精品视频在线观看| 欧美黑人国产人伦爽爽爽| 精品久久久久人成| 久久青草福利网站| 日韩中文有码在线视频| 欧美成人激情图片网| 久久久伊人日本| 国产精品美女在线观看| 91高清视频免费| 国产精品视频一区二区三区四| 久久中文久久字幕| 久久国产精品电影| 日本欧美国产在线| 日韩在线播放一区| 国产一区二中文字幕在线看| 国产日韩精品一区二区| 国产精品av免费在线观看| 高跟丝袜欧美一区| 午夜精品蜜臀一区二区三区免费| 日韩一级黄色av| 欧美日韩亚洲91| 亚洲国产精品资源| 国产综合视频在线观看| 欧美日韩亚洲一区二区| 美日韩精品免费视频| 国产最新精品视频| 成人午夜激情网| 91高潮精品免费porn| 国产日韩欧美成人| 日韩精品中文在线观看| 国产手机视频精品| 日韩av在线网址| 亚洲人成电影网站色…| 欧美激情在线视频二区| 一本大道久久加勒比香蕉| 亚洲精品乱码久久久久久金桔影视| 91极品视频在线| 中文日韩在线视频| 色悠久久久久综合先锋影音下载| 亚洲视频欧洲视频| 久热国产精品视频| 精品色蜜蜜精品视频在线观看| 亚洲女人被黑人巨大进入| 日韩精品免费一线在线观看| 亚洲人午夜精品| 亚洲国产日韩欧美在线动漫| 日韩中文字幕在线观看| 川上优av一区二区线观看| 久久久精品国产一区二区| 欧美小视频在线观看| 国产狼人综合免费视频| 成人黄色中文字幕| 成人免费xxxxx在线观看| 国产一区二区三区视频在线观看| 国产精品久久久久久久久久久新郎| 亚洲女性裸体视频| 日本国产一区二区三区| 美日韩丰满少妇在线观看| 欧美日韩国产成人高清视频| 97色在线视频观看| 中文字幕无线精品亚洲乱码一区| 国产精品久久久久久av福利| 欧美亚洲激情在线| 午夜精品免费视频| 九九精品视频在线观看| 亚洲精品xxxx| 久久伊人91精品综合网站| 国产成人在线播放| 性欧美视频videos6一9| 成人免费在线网址| 日本午夜精品理论片a级appf发布| 久久久久久国产精品三级玉女聊斋| 午夜精品久久久久久久99热浪潮| 亚洲国产精品中文| 亚洲新中文字幕| 国产精品美女久久久久av超清| 国产日韩视频在线观看| 亚洲综合中文字幕68页|