का मैन्युअल सत्यापन मैन्युअल संदर्भ सत्यापन सफलतापूर्वक कर सकता है (प्रत्येक संदर्भित तत्व -> 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));
बात यह है कि मुझे ज्यादा भ्रमित है कि दो डाइजेस्ट अलग अलग आकार है, लेकिन निश्चित रूप से मैं भी बिल्कुल वैसा ही मूल्य प्राप्त करने की आवश्यकता है दो गणनाओं से। कोई सुझाव? धन्यवाद।
"टैग्स के बीच सभी रिक्त स्थान को हटाने" ... क्या यह सही है? Http://www.w3.org/TR/2001/REC-xml-c14n-20010315#Example-WhitespaceInContent को देखकर ऐसा लगता है कि आप बहुत अधिक सफेद जगह निकाल रहे हैं। –
उत्तर के लिए धन्यवाद। मैं आपके बिंदु को समझता हूं, लेकिन जैसा कि मैंने प्रश्न की शुरुआत में कहा था, मैं सफलतापूर्वक उन सत्यापनों को हटाकर संदर्भ सत्यापन (दो संदर्भ, यह एक दुर्घटना नहीं हो सकता) कर सकता हूं, इसलिए मुझे लगता है कि मुझे उन जगहों को हटाकर, इसलिए मुझे लगता है यह सही है। – Johnca
कैनोनाइजेशन व्हाइटस्पेस को हटाने से कहीं ज्यादा है। यह नेमस्पेस-उपसर्ग मुद्दों, विशेषता ऑर्डरिंग और आमतौर पर फ़िसिकल फ़ाइल (और इस प्रकार हैश डाइजेस्ट) के बाइट ऑर्डर को बदलता है, लेकिन एक्सएमएल इंफोसेट (== एक्सएमएल का अर्थ पेलोड) नहीं बदलता है – m0sa