25

मैंने कई मंचों और उदाहरणों की समीक्षा की, लेकिन किसी ने मेरी मदद नहीं की। मुझे किसी भी webservice से हस्ताक्षर सत्यापित करने की आवश्यकता है। मेरे पास सत्यापित करने के लिए सार्वजनिक कुंजी के साथ test.crt फ़ाइल है।हस्ताक्षर कैसे सत्यापित करें, सीआरटी फ़ाइल से सार्वजनिक कुंजी लोड हो रहा है?

static bool Verify(string text, string signature) 
{ 
    X509Certificate2 cert = new X509Certificate2(
     HttpContext.Current.Server.MapPath("test-server.cert")); 
    RSACryptoServiceProvider csp = (RSACryptoServiceProvider) cert.PublicKey.Key; 

    // Hash the data 
    SHA1Managed sha1 = new SHA1Managed(); 
    UnicodeEncoding encoding = new UnicodeEncoding(); 
    byte[] data = encoding.GetBytes(text); 
    byte[] sign = Convert.FromBase64String(signature); 
    byte[] hash = sha1.ComputeHash(data); 

    return csp.VerifyHash(hash, CryptoConfig.MapNameToOID("SHA1"), sign); 
} 

लेकिन परिणाम हमेशा गलत है :(

मैं एक OpenSSL उदाहरण है:।

openssl base64 -d -in signature -out signature.bin 
openssl dgst -sha1 -verify test-server.pub -signature signature.bin from_gateway 
+0

मुझे लगता है कि एक पाठ के लिए एक हस्ताक्षर उत्पन्न करता है एक सरल अनुप्रयोग बनाया है और तुरंत पुष्टि करता है। आप इसे यहां देख सकते हैं: https://dl.dropbox.com/u/1171045/11221877/Program.cs –

+0

तो ऊपर की विधि ठीक है। क्या आप वाकई हस्ताक्षर और सत्यापन के लिए उचित प्रमाणपत्र का उपयोग कर रहे हैं? –

+3

मैंने वेब ऐप के साथ ऐसा ही किया, इसलिए यह एक वेब चीज नहीं है। आप अपने ऐप पर वेब सेवा से हस्ताक्षर कैसे पास करते हैं? –

उत्तर

1

मैं उपयोग UnicodeEncoding संदेह विफलताओं के लिए कारण हो सकता है ASCIIEncoding के बाइट्स नीचे बताया गया है के रूप में और यूनिकोड एन्कोडिंग एएससीआईआई 8 बिट एन्कोडिंग के कारण के लिए समान नहीं है और विंडोज यूनिकोड एन्कोडिंग में 16 बिट चौड़ा है। आपके अन्य प्रश्न Can not get signature में आपने ASCIIEncoding का उपयोग किया है। इसलिए मानते हैं कि हस्ताक्षर की गणना AS /II टेक्स्ट/स्ट्रिंग और वी के ASCIIEncoding बाइट्स पर की जाती है। यूनिकोड एन्कोडिंग का उपयोग करके मिटाएं स्पष्ट रूप से मेल नहीं खाएंगे।

string text = "Hello"; 
Console.WriteLine("ASCIIEncoding bytes length: {0}", new ASCIIEncoding().GetBytes(text).Length); 
Console.WriteLine("UnicodeEncoding bytes length: {0}", new UnicodeEncoding().GetBytes(text).Length); 

आउटपुट

ASCIIEncoding bytes length: 5 
UnicodeEncoding bytes length: 10