日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > asp.net >内容正文

asp.net

xml 数字签名 破解_JAVA中带有数字签名的XML安全性

發布時間:2023/12/3 asp.net 23 豆豆
生活随笔 收集整理的這篇文章主要介紹了 xml 数字签名 破解_JAVA中带有数字签名的XML安全性 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

xml 數字簽名 破解

介紹

如您所知,XML在我們的產品或項目開發中起著重要作用,并且從XML文檔中我們收集了很多信息,并且我們可以對XML文件執行CRUD操作。 但是,關于如何確保XML文件中可用的數據是真實的以及數據來自受信任的可靠來源,這是一個令人關注的問題。 關于來自XML文件的數據的真實性或獨創性,可能存在許多問題。 開發人員通常不考慮數據的真實性而處理XML文檔是一種慣例。 但是在某些情況下,您需要解決以上各行提出的所有要點和問題。 讓我們考慮一下現實世界的情況,每當我們收到郵局的信件或郵件時,我們如何知道這封信是來自我們的朋友的? 它基于他/她的典型陳述或單詞或地址詳細信息。 這可能是他/她的角色簽名。 有時,我們收到的信件也可能被陌生人添加了另一頁所修改。 由于所有這些原因,我們通常會驗證朋友的手寫簽名。 這都是關于普通郵局的信。 電子訊息呢? 我們如何驗證電子消息是真實的? 在這種情況下,我們必須采用該技術進行數字簽名。 在本文中,我將簡要介紹XML數字簽名,它對我們的數據完整性起著重要作用。 在本文中,我將向您展示如何將數字簽名附加到XML文檔,以及如何使用附加的簽名驗證XML文檔。

技術性

在最近幾年中,XML Digital Signature獲得了強勁的發展,尤其是在金融領域。 在進入XML數字簽名之前,讓我們考慮一個典型的場景以供我們理解。 考慮一個組織以XML文檔的形式將其雇員的所有工資詳細信息發送到所得稅部門的情況。 現在是一個問題,所得稅部門如何驗證XML文件? 這意味著IT部門必須驗證組織中所有員工的敏感信息。 IT部門必須確保XML文檔來自受信任的來源,并且在進入IT部門時尚未對其進行修改。 這意味著文檔之間沒有進行調整。 首先,我們必須了解數字簽名的概念。 數字簽名是一種電子簽名,用于驗證受信任人員發送的文檔的真實性。 它還可以確保文檔原始內容在傳輸過程中沒有被修改。 數字簽名可以與任何消息一起使用,無論它是否經過加密,以便接收者可以確定發送者的身份,并且該消息不會被陌生人更改。 根據Wikipedia的說法,數字簽名是一種數學方案,用于證明數字消息或文檔的真實性。 有效的數字簽名使收件人有理由相信該郵件是由已知的發件人創建的,這樣,發件人就無法否認已發送了該郵件(身份驗證和不可否認),并且該郵件在傳輸過程中沒有發生更改(完整性)。 數字簽名通常用于軟件分發,財務交易,以及在其他情況下檢測偽造或篡改非常重要的情況。

讓我們看一個帶有數字簽名的完整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> aUEMrCT5dzeOfSNaznzoT0If8WZ8KQcMNXDqtoeseonVk3NqOk9ctcxrf3QVX3wP6810DDRPdI6le8ccG64Ge0HjkO+aYC5+c2L/qKBzwtSbl/olJEuFU2DVxBQO+K29TTUJfxpVzC9Zf2pvT+1NRj0f2/ofHujYZ01D6+YqI8c=</SignatureValue><KeyInfo><KeyValue><RSAKeyValue><Modulus> jfAd5uV38L36+lDZJrqfH9oLN86VJezXYfAeU+lrFoHlKAXVJLAi9hKvBHQRer4tPfdez6iSBKsl6IHkPnVRAKt0xU99uxi5QpymsWAX3qnBqHlw9Z70PwyZ+Xysfw4Q2tK2HtSgUOhMuaUcIf9sbHvfgbvcRPgxDZZqfIzDmDU=</Modulus><Exponent>AQAB</Exponent></RSAKeyValue></KeyValue></KeyInfo></Signature> </SalaryDeposit>

上面的XML文件是經過數字簽名的文件,可以在任何時間進行驗證。 上面的XML文件包含有關員工姓名,帳號和薪水金額的信息。 但是實際的數字簽名附加在標簽<Signature> </ Signature>中。 <Signature>中的信息提供了文檔的真實性。 由于可以看到數據,因此可以自由更改數據,但是在簽名驗證過程中它將失敗。

基本上,存在三種類型的XML簽名。

  • 信封簽名
  • 信封簽名
  • 分離的簽名

信封簽名

在這種情況下,簽名是經過簽名的XML對象的子級。 這意味著<Signature>是郵件XML文檔中的子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>的結構如下。

<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數字簽名,請遵循以下步驟。

  • 生成一對稱為私鑰和公鑰的密鑰。
  • 獲取原始XML文檔。
  • 通過Java API使用私鑰和公鑰對原始XML文檔簽名,然后生成另一個具有XML數字簽名的文檔。
  • 讓我們看一下用于生成XML數字簽名的簡短Java代碼段。

    public void generateXMLDigitalSignature(String originalXmlFilePath, String destnSignedXmlFilePath, String privateKeyFilePath, String publicKeyFilePath) { //Get the XML Document object Document doc = getXmlDocument(originalXmlFilePath); //Create XML Signature Factory 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(); } //Pass the Public Key File Path KeyInfo keyInfo = getKeyInfo(xmlSigFactory, publicKeyFilePath); //Create a new XML Signature XMLSignature xmlSignature = xmlSigFactory.newXMLSignature(signedInfo, keyInfo); try { //Sign the document xmlSignature.sign(domSignCtx); } catch (MarshalException ex) { ex.printStackTrace(); } catch (XMLSignatureException ex) { ex.printStackTrace(); } //Store the digitally signed document inta a location storeSignedDoc(doc, destnSignedXmlFilePath); }

    XML簽名驗證

    XML數字簽名驗證涉及以下操作。

    • 驗證數字簽名
      • 計算<SignedInfo>元素的摘要

    為了驗證簽名的XML文檔,請按照下列步驟操作。

  • 獲取簽名的XML文檔和公共密鑰。
  • 驗證<SignedInfo>元素的數字簽名
  • 計算<SignedInfo>元素的摘要并比較這些值。
  • 讓我們看一下XML數字簽名驗證的簡短Java代碼段。

    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; }

    因此,從上面的代碼中可以明顯看出,可以使用<SignatureMethod>元素中指定的摘要算法重新計算<SignedInfo>元素的摘要值,并使用公鑰來驗證XML簽名,以驗證該值<SignatureValue>元素的“摘要”對于<SignedInfo>元素的摘要值是正確的。 在<SignedInfo>元素內重新計算引用的摘要,并將它們與每個<Reference>元素的相應<DigestValue>元素中包含的摘要值進行比較。 仍然讓我們熟悉一些負責XML數字簽名的java組件。

    XMLSignatureFactory

    它是一個工廠對象,用于使用“ DOM”機制類型為XML文檔生成數字簽名。 以下列方式創建對象。

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

    DOMSignContext

    DOMSignContext對象用于形成DOM樹,在創建數字簽名時將在其中附加XML數字簽名。 該對象接受私鑰和XML文檔的根元素。

    參考

    引用對象用于在XML數字簽名的主要Signature標簽的SignedInfo元素內作為元素創建。 該對象創建一個標簽,作為W3C XML簽名語法和處理規則的一部分。 參考元素的基本結構如下。

    <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> <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>

    XML簽名

    最后,創建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中XML數字簽名的完整項目,也可以從下面的保管箱鏈接下載。

    • https://www.dropbox.com/s/0k1iukhy0in6n8h/xmldigitalsignature1.zip

    您可以在您喜歡的Java IDE中配置該項目,然后運行測試源文件夾中提供的獨立程序。 該項目已經包含私鑰和公鑰。 如果要生成,請運行Java類“ TestGenerateKeys”以生成一對密鑰。 您還可以提供自己的XMl文件的路徑,以查看XML數字簽名是如何生成的。

    結論

    希望您喜歡我關于Java中的XML數字簽名的文章。 創建XML數字簽名的方法也很多,我僅提供了使用Java API生成封裝的數字XML簽名的方法。 下載完整的項目并查看源代碼,以了解概念及其用法。 為了更清楚起見,我在資源和參考部分中提供了一些基本鏈接。 如有任何問題和錯誤,請隨時通過debadatta.mishra@gmail.com與我聯系。

    資源與參考

    • http://en.wikipedia.org/wiki/XML_Signature
    • http://msdn.microsoft.com/en-us/library/ms996502.aspx
    • http://www.xml.com/pub/a/2001/08/08/xmldsig.html

    翻譯自: https://www.javacodegeeks.com/2013/10/xml-security-with-digital-signature-in-java.html

    xml 數字簽名 破解

    總結

    以上是生活随笔為你收集整理的xml 数字签名 破解_JAVA中带有数字签名的XML安全性的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。