c# - 在 C# 中使用私钥对数据进行签名

标签 c# cryptography httprequest rsa digital-signature

我需要使用算法 SHA1RSA 用一个私钥对一些数据进行签名,Rsa key 长度为 2048,采用 64 基编码。我的代码是这样的

string sPayload = "";
HttpWebRequest httpWebRequest = (HttpWebRequest)WebRequest.Create("URI");
httpWebRequest.ContentType = "application/json; charset=utf-8";
httpWebRequest.Method = WebRequestMethods.Http.Post;

using (StreamWriter streamWriter = new StreamWriter(httpWebRequest.GetRequestStream()))
{
    sPayload = "{\"id\":\"14123213213\"," +
                "\"uid\":\"teller\"," +
                "\"pwd\":\"abc123\"," +
                "\"apiKey\":\"2343243\"," +
                "\"agentRefNo\":\"234324324\"}";

    httpWebRequest.Headers.Add("SIGNATURE", Convert.ToBase64String(new System.Security.Cryptography.SHA1CryptoServiceProvider().ComputeHash(Encoding.ASCII.GetBytes(sPayload))));
    
    streamWriter.Write(sPayload);
    streamWriter.Flush();
    streamWriter.Close();
}

System.Net.ServicePointManager.Expect100Continue = false;

HttpWebResponse httpResponse = (HttpWebResponse)httpWebRequest.GetResponse();

using (StreamReader streamReader = new StreamReader(httpResponse.GetResponseStream()))
{
    string result = streamReader.ReadToEnd();
}

在 header 名称签名中,我需要使用私钥传递签名数据(sPayload)。但是使用上面的代码会出现来自第三方的“无效签名”错误,并且我不确定加密部分是否是正确与否。

httpWebRequest.Headers.Add("SIGNATURE", Convert.ToBase64String(new System.Security.Cryptography.SHA1CryptoServiceProvider().ComputeHash(Encoding.ASCII.GetBytes(sPayload))));

第三方提供了一个证书(cert、sha1)和 key 。我应该将其引用代码吗?

最佳答案

您计算了 sPayload 的 SHA-1 哈希值,而不是 RSA-SHA1 签名。

如果您有 X509Certificate2:

using (RSA rsa = cert.GetRSAPrivateKey())
{
    return rsa.SignData(sPayload, HashAlgorithmName.SHA1, RSASignaturePadding.Pkcs1);
}

如果您已有原始 RSA key ,则无需使用 using 语句。

如果您出于其他原因必须计算 sPayload 的哈希值,您可以这样做

byte[] hash;
byte[] signature;

using (HashAlgorithm hasher = SHA1.Create())
using (RSA rsa = cert.GetRSAPrivateKey())
{
    hash = hasher.ComputeHash(sPayload);
    signature = rsa.SignHash(hash, HashAlgorithmName.SHA1, RSASignaturePadding.Pkcs1);
}

SignHash 仍然需要 HashAlgorithmName 值,因为算法标识符嵌入在签名中。

关于c# - 在 C# 中使用私钥对数据进行签名,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31828420/

相关文章:

C# 并行.For

google-maps - 自定义标记图标未显示 Google 静态 map v2

java - 我的 Android 应用程序 httpGet 出错

c# - 使用 Google 作为身份提供商,通过 Azure ACS 对 Restful 服务进行身份验证

c# - Entity Framework 与 LINQ 聚合连接字符串?

c# - 为什么我得到 "Invalid algorithm specified"异常

key 大小的 C# 和 PHP 加密/解密 php 问题

javascript - 如何使用 Javascript(不是 jQuery)发出 DELETE http 请求

c# - Xamarin.Android 上的多个彩色 Activity 标签元素

node.js - 从 Node 中的对象生成一致的 sha256 哈希值