25

Tôi đã xem xét nhiều diễn đàn và ví dụ, nhưng không có ai giúp tôi. Tôi cần xác minh chữ ký từ bất kỳ dịch vụ web nào. Tôi có tệp test.crt với khóa công khai để xác minh.Cách xác minh chữ ký, tải khóa công khai từ tệp 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); 
} 

Nhưng kết quả luôn luôn là sai :(

Tôi có một ví dụ OpenSSL:.

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

Tôi tạo ra một ứng dụng đơn giản mà tạo ra một chữ ký cho một văn bản và ngay lập tức kiểm tra nó. Bạn có thể kiểm tra tại đây: https://dl.dropbox.com/u/1171045/11221877/Program.cs –

+0

Vì vậy, phương pháp trên khá ổn. Bạn có chắc chắn rằng bạn đang sử dụng chứng chỉ phù hợp để ký và xác minh không? –

+3

Tôi đã làm tương tự với ứng dụng web, vì vậy nó không phải là một điều web. Làm thế nào để bạn vượt qua một chữ ký từ dịch vụ web cho ứng dụng của bạn? –

Trả lời

1

tôi nghi ngờ việc sử dụng UnicodeEncoding thể là lý do cho thất bại Như thể hiện dưới các byte của ASCIIEncoding và UnicodeEncoding không giống với lý do ASCII là mã hóa 8 bit và trong mã hóa Unicode của Windows là 16 bit, trong câu hỏi khác của bạn là Can not get signature bạn đã sử dụng mã ASCIIEncoding. erify bằng cách sử dụng UnicodeEncoding rõ ràng sẽ không phù hợp.

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

Đầu ra

ASCIIEncoding bytes length: 5 
UnicodeEncoding bytes length: 10 
Các vấn đề liên quan