2015-08-05 3 views
0

мне нужно подписать какие-то данные с одного секретного ключа с использованием алгоритма SHA1RSA, длина ключа Rsa 2048 с 64 базовым кодом encoding.My подобно этомуПодписание данных с секретным ключом в C#

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

Во имя заголовка Подпись Мне нужно передать подписанные данные (sPayload) с помощью закрытого ключа. Но, используя вышеприведенный код, ошибка получается как «недопустимая подпись» от третьей стороны, и я не уверен, правильна ли часть шифрования или нет.

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

Третья сторона должна была предоставить один сертификат (сертификат, sha1) и key.should я см, что в коде?

+0

В классах .NET нет ничего плохого. Ваш код, хотя просто генерирует хеш, ничего не подписывает. Не зная, какую подпись вы хотите создать, это невозможно. Даже если другая сторона просто запрашивает хэш данных, вы должны убедиться, что вы хешируете ту же полезную нагрузку, которую ожидает другая сторона. Ошибка одиночного байта (например, неправильная escape-последовательность) создаст совершенно разные значения хэш-функции. Есть ли у вас примеры ввода/вывода? –

+0

Также ПОЖАЛУЙСТА, извлеките важный код в разные строки, если не отдельный метод, который можно протестировать. Вы поместили всю важную работу вашего метода подписи в одну очень длинную строку, которую невозможно прочитать. –

+0

необходимо сгенерировать сигнатуру с использованием алгоритма: SHA1RSA, RSA Длина ключа: 2048, Кодировка: Base64.Payload должен быть подписан с приватным ключ, предоставленный другой стороной и структуры запроса является { ID: "строка", UID: "строка", PWD: "строка", apiKey: "строка", agentRefNo: "строка" } –

ответ

0

Вы вычислили хэш SHA-1 sPayload, а не подпись RSA-SHA1.

Если у вас есть X509Certificate2:

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

Если у вас уже есть сырой ключ RSA, то просто уйти от с помощью заявления.

Если нужно вычислить хэш 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, поскольку идентификатор алгоритма встроен в подписи.

Смежные вопросы