【发布时间】:2012-06-28 15:06:21
【问题描述】:
我查看了许多论坛和示例,但没有一个对我有帮助。我需要验证任何网络服务的签名。我有用于验证的带有公钥的 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
【问题讨论】:
-
我创建了一个简单的应用程序,它为文本生成签名并立即验证它。你可以在这里查看:dl.dropbox.com/u/1171045/11221877/Program.cs
-
所以上面的方法还是可以的。您确定使用正确的证书进行签名和验证吗?
-
我对网络应用做了同样的事情,所以它不是网络的东西。您如何将签名从 Web 服务传递到您的应用程序?
-
@drup 你确定签名是正确的吗?因为在这里你说你不能得到签名:stackoverflow.com/questions/11184890/can-not-get-signature
-
我没有发现代码有任何问题,因此请检查您的输入。例如。我可以看到您似乎在 C# 代码中使用了 openssl 的二进制签名和 base64 编码的签名。任何错误的字符编码也可以解决问题,可能 openssl 假定为 ASCII,您似乎假定为 16 位 Unicode(让 Microsoft 将编码称为“Unicode”,有时他们可能是这样的白痴)。
标签: c# cryptography digital-signature public-key-encryption x509