2010-12-11 16 views
8

का मैन्युअल सत्यापन मैन्युअल संदर्भ सत्यापन सफलतापूर्वक कर सकता है (प्रत्येक संदर्भित तत्व -> SHA1 -> Base64 -> जांचें कि यह DigestValue सामग्री के समान है) लेकिन मैं SignatureValue के सत्यापन में विफल रहता हूं। यहाँ SignedInfo canonicalize करने और हैश है:एक्सएमएल हस्ताक्षर

<ds:SignedInfo xmlns:ds="http://www.w3.org/2000/09/xmldsig#"> 
<ds:CanonicalizationMethod Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#"></ds:CanonicalizationMethod> 
<ds:SignatureMethod Algorithm="http://www.w3.org/2000/09/xmldsig#rsa-sha1"></ds:SignatureMethod> 
<ds:Reference URI="#element-1-1291739860070-11803898"> 
    <ds:Transforms> 
    <ds:Transform Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#"></ds:Transform> 
    </ds:Transforms> 
    <ds:DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha1"></ds:DigestMethod> 
    <ds:DigestValue>d2cIarD4atw3HFADamfO9YTKkKs=</ds:DigestValue> 
</ds:Reference> 
<ds:Reference URI="#timestamp"> 
    <ds:Transforms> 
    <ds:Transform Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#"></ds:Transform> 
    </ds:Transforms> 
    <ds:DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha1"></ds:DigestMethod> 
    <ds:DigestValue>YR/fZlwJdw+KbyP24UYiyDv8/Dc=</ds:DigestValue> 
</ds:Reference> 
</ds:SignedInfo> 

अटेर टैग के बीच सभी रिक्त स्थान को हटाने (और इसलिए एक ही लाइन पर पूरे तत्व हो रही), मैं इस SHA1 प्राप्त पचाने (Base64 में):

6l26iBH7il/yrCQW6eEfv/VqAVo =

अब मैं एक ही SignatureValue सामग्री के डिक्रिप्शन के बाद पचा पाने की उम्मीद है, लेकिन मैं एक differente और अब मूल्य प्राप्त:

MCEwCQYFKw4DAhoFAAQ U3M24VwKG02yUu6jlEH + u6R4N8Ig =

यहाँ decyption के लिए कुछ जावा कोड है:

 DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();  
    DocumentBuilder builder = dbf.newDocumentBuilder(); 
    Document doc = builder.parse(new File(inputFilePath)); 
    NodeList nl = doc.getElementsByTagName("ds:SignatureValue"); 
    if (nl.getLength() == 0) { 
    throw new Exception("Cannot find SignatureValue element"); 
    } 
    String signature = "OZg96GMrGh0cEwbpHwv3KDhFtFcnzPxbwp9Xv0pgw8Mr9+NIjRlg/G1OyIZ3SdcOYqqzF4/TVLDi5VclwnjBAFl3SEdkyUbbjXVAGkSsxPQcC4un9UYcecESETlAgV8UrHV3zTrjAWQvDg/YBKveoH90FIhfAthslqeFu3h9U20="; 
    X509Certificate cert = X509Certificate.getInstance(new FileInputStream(<a file path>)); 
    PublicKey pubkey = cert.getPublicKey(); 
    Cipher cipher = Cipher.getInstance("RSA","SunJCE"); 
    cipher.init(Cipher.DECRYPT_MODE, pubkey); 
    byte[] decodedSignature = Base64Coder.decode(signature); 
    cipher.update(decodedSignature); 
    byte[] sha1 = cipher.doFinal(); 


    System.out.println(Base64Coder.encode(sha1)); 

बात यह है कि मुझे ज्यादा भ्रमित है कि दो डाइजेस्ट अलग अलग आकार है, लेकिन निश्चित रूप से मैं भी बिल्कुल वैसा ही मूल्य प्राप्त करने की आवश्यकता है दो गणनाओं से। कोई सुझाव? धन्यवाद।

+0

"टैग्स के बीच सभी रिक्त स्थान को हटाने" ... क्या यह सही है? Http://www.w3.org/TR/2001/REC-xml-c14n-20010315#Example-WhitespaceInContent को देखकर ऐसा लगता है कि आप बहुत अधिक सफेद जगह निकाल रहे हैं। –

+0

उत्तर के लिए धन्यवाद। मैं आपके बिंदु को समझता हूं, लेकिन जैसा कि मैंने प्रश्न की शुरुआत में कहा था, मैं सफलतापूर्वक उन सत्यापनों को हटाकर संदर्भ सत्यापन (दो संदर्भ, यह एक दुर्घटना नहीं हो सकता) कर सकता हूं, इसलिए मुझे लगता है कि मुझे उन जगहों को हटाकर, इसलिए मुझे लगता है यह सही है। – Johnca

+0

कैनोनाइजेशन व्हाइटस्पेस को हटाने से कहीं ज्यादा है। यह नेमस्पेस-उपसर्ग मुद्दों, विशेषता ऑर्डरिंग और आमतौर पर फ़िसिकल फ़ाइल (और इस प्रकार हैश डाइजेस्ट) के बाइट ऑर्डर को बदलता है, लेकिन एक्सएमएल इंफोसेट (== एक्सएमएल का अर्थ पेलोड) नहीं बदलता है – m0sa

उत्तर

8

MCEwCQYFKw4DAhoFAAQU3M24VwKG02yUu6jlEH+u6R4N8Ig= एक DER- एन्कोड ASN.1 संरचना के लिए Base64 एन्कोडिंग है: एक SEQUENCE पहले युक्त एक AlgorithmIdentifier (जिसमें कहा गया है कि इस पर SHA-1 है, कोई पैरामीटर के बाद से SHA-1 कोई भी स्वीकार करता है) के साथ एक OCTET STRING जो होता है, तो वास्तविक 20-बाइट मान। हेक्साडेसिमल में, मान है: dccdb8570286d36c94bba8e5107faee91e0df088

यह ASN.1 संरचना मानक RSA signature तंत्र का हिस्सा है। आप उस संरचना तक पहुंचने के लिए आरएसए डिक्रिप्शन का उपयोग कर रहे हैं, जो गैर-मानक है। आप वास्तव में सब पर कुछ भी पाने के लिए भाग्यशाली हैं, क्योंकि RSA एन्क्रिप्शन और आरएसए हस्ताक्षर दो अलग एल्गोरिदम हैं। ऐसा इसलिए होता है कि वे दोनों एक ही तरह के कुंजी जोड़े पर खिलाते हैं, और "पुरानी शैली" (उर्फ "पीकेसीएस # 1 v1.5") हस्ताक्षर और एन्क्रिप्शन योजनाएं समान पैडिंग तकनीकों का उपयोग करती हैं (समान लेकिन समान नहीं; यह है पहले से ही आश्चर्य की बात है कि आरएसए के जावा कार्यान्वयन ने डिक्रिप्शन मोड में उपयोग किए जाने पर हस्ताक्षर पैडिंग पर जोर नहीं दिया था)।

वैसे भी, 6l26iBH7il/yrCQW6eEfv/VqAVo= 20-बाइट मान के लिए बेस 64 एन्कोडिंग है, जो हेक्साडेसिमल में है: ea5dba8811fb8a5ff2ac2416e9e11fbff56a015a। टैग के बीच सभी व्हाइटस्पेस को हटाए जाने के बाद, आप ऊपर दिखाए गए एक्सएमएल संरचना को हैशिंग करके प्राप्त करते हैं। सभी व्हाइटस्पेस को हटाकर उचित कैननिकलाइज़ेशन नहीं है। असल में, जहां तक ​​मुझे पता है, व्हाइटस्पेस केवल टैग के भीतर विशेषताओं के बीच प्रभावित होता है, लेकिन बाह्य सफेद जगह को अपरिवर्तित रखा जाना चाहिए (सामान्यीकरण लाइन को समाप्त करने के अलावा [एलएफ/सीआर + एलएफ चीज])।

हस्ताक्षर पीढ़ी (dccdb85...) के लिए उपयोग किया जाने वाला मान आपके द्वारा दिखाए गए एक्सएमएल ऑब्जेक्ट का उपयोग करके और प्रमुख रिक्त स्थान को हटाकर प्राप्त किया जा सकता है। स्पष्ट होने के लिए: आप एक्सएमएल को एक फाइल में पेस्ट करें, फिर प्रत्येक पंक्ति पर अग्रणी रिक्त स्थान (0 से 3 रिक्त स्थान) हटा दें। आप सुनिश्चित करते हैं कि सभी अंत-रेखाएं एक एकल एलएफ (0x0A बाइट) का उपयोग करें और आप अंतिम एलएफ को हटा दें (केवल </ds:SignedInfo> के बाद)। परिणामी फ़ाइल लंबाई 930 बाइट्स होना आवश्यक है, और इसके SHA-1 हैश की उम्मीद dccdb85... मूल्य है।

+0

आपको स्पष्ट और हल करने वाले उत्तर के लिए धन्यवाद !!! जहां "प्रमुख स्थान हटाएं" विचार आता है? वैसे भी मुझे आश्चर्य है कि org.apache.xml.security क्यों .c14n.Canonicalizer उन्हें हटा नहीं देता है और मुझे दो कार्यों के लिए दो अलग-अलग xml प्रस्तुतियों की आवश्यकता क्यों है: संदर्भ सत्यापन के लिए मुझे टैग के बीच सभी रिक्त स्थान को हटाना होगा जबकि हस्ताक्षर सत्यापन के लिए मुझे आपके द्वारा लिखे गए कार्यों को करना होगा। वैसे भी एक्सएमएल संदेश जेबॉस तैनात सर्लेट से भेजा गया था और जेबॉस तैनात वेब सेवा द्वारा प्राप्त किया गया था। शायद जेबॉस गैर मानक काम करता है? – Johnca

+0

मैंने वेब पेज पर "प्रमुख रिक्त स्थान हटाएं" देखा जो कैनोलिकलाइजेशन को समझाने की कोशिश करता है (मुझे याद नहीं है जो)। कैनोनिकललाइजेशन टेक्स्ट सामग्री को अपरिवर्तित रखता है, जिसमें रिक्त स्थान भी शामिल हैं (अपाचे कैनोनिकलइज़र उन्हें हटाने में सही नहीं है)। चूंकि रिक्त स्थान परेशान हैं, इसलिए इसे बिना किसी एक्सएमएल के एक्सएमएल बनाने के लिए _recommended_ है एन इंडेंटेशन (यानी कोई अग्रणी जगह नहीं)। मेरा अनुमान है कि मूल एक्सएमएल में प्रमुख रिक्त स्थान नहीं थे, और उन्हें कुछ बिंदु (_after_ हस्ताक्षर गणना) में "पढ़ने वाले सहायक" के रूप में जोड़ा गया था (जो हस्ताक्षर को गड़बड़ करता है)। –

0

अपने विशेष एक्सएमएल टोकन को देखते हुए, मैं तुम्हें कुछ बातें बता सकते हैं।

  • आप कैनॉनिकलाइज़ेशन विधि विशेष एक्सएमएल कैनॉनिकलाइज़ेशन संस्करण 1.0 उपयोग कर रहे हैं। यह एक बहुत ही महत्वपूर्ण कारक यह सुनिश्चित करने में है कि आप सही पाचन मूल्य और हस्ताक्षर उत्पन्न करते हैं।

  • आप एक ही कैनॉनिकलाइज़ेशन विधि का उपयोग कर रहे हैं दोनों कंप्यूटिंग संदर्भ डाइजेस्ट के लिए, और हस्ताक्षर के उत्पादन से पूर्व SignedInfo canonicalizing के लिए।

विशेष एक्सएमएल Canonicalizaiton संस्करण 1.0 के लिए विनिर्देश W3C द्वारा उत्पादन किया जाता है और अपने संबंधित W3C Recommendation में पाया जा सकता। यदि आप अपने मानों को मैन्युअल रूप से कंप्यूटिंग कर रहे हैं, तो सुनिश्चित करें कि आप बिल्कुल विनिर्देश के अनुरूप हैं, क्योंकि कैनोनिकललाइजेशन सही होने के लिए एक कठिन चीज है, और यह सही ढंग से करने के लिए बहुत महत्वपूर्ण है, अन्यथा आपके मान गलत होंगे।

मैंने अभी एक्सएमएल हस्ताक्षर सत्यापन प्रक्रिया का वर्णन करने वाला एक व्यापक लेख लिखा है। लेख my blog पर स्थित है। यह प्रक्रिया को मेरे उत्तर से अधिक विस्तार से वर्णित करता है, क्योंकि एक्सएमएल हस्ताक्षर की कई जटिलताएं हैं। इसमें प्रचलित विनिर्देशों और आरएफसी के लिंक भी शामिल हैं।

संबंधित मुद्दे