2016-04-26 2 views
5

Мне нужно сгенерировать хэш HMAC-SHA256 в PCL (для Xamarin Forms), который не поддерживает встроенные классы HMAC/криптографии .NET, поэтому я работаю с BouncyCastle для реализации моих классов криптографии.Создайте хэш HMAC-SHA256 с BouncyCastle

Мне нужно создать хэш HMAC-SHA256, но я не смог найти какой-либо пример в Google, и у BouncyCastle, похоже, нет документации для этого. Может кто-нибудь мне помочь?

+0

Возможный дубликат [C# PCL HMACSHAX с BouncyCastle-PCL] (http://stackoverflow.com/questions/30974846/c-sharp-pcl-hmacshax-with-bouncycastle-pcl) – Nkosi

ответ

4

Благодаря решению here я придумал этот код:

public class HmacSha256 
{ 
    public byte[] Hash(string text, string key) 
    { 
     var hmac = new HMac(new Sha256Digest()); 
     hmac.Init(new KeyParameter(Encoding.UTF8.GetBytes(key))); 
     byte[] result = new byte[hmac.GetMacSize()]; 
     byte[] bytes = Encoding.UTF8.GetBytes(text); 

     hmac.BlockUpdate(bytes, 0, bytes.Length); 
     hmac.DoFinal(result, 0); 

     return result; 
    } 
} 

Соответствующим модульного теста (использует FluentAssertions):

[TestClass] 
public class HmacSha256Tests 
{ 
    private readonly HmacSha256 _hmac = new HmacSha256(); 

    [TestMethod] 
    public void Hash_GeneratesValidHash_ForInput() 
    { 
     // Arrange 
     string input = "hello"; 
     string key = "test"; 
     string expected = "F151EA24BDA91A18E89B8BB5793EF324B2A02133CCE15A28A719ACBD2E58A986"; 

     // Act 
     byte[] output = _hmac.Hash(input, key); 

     string outputHex = BitConverter.ToString(output).Replace("-", "").ToUpper(); 

     // Assert 
     expected.Should().Be(outputHex); 
    } 
} 
+0

Так где же 'HMac' и 'Sha256Digest'? –

+0

@AndrewSavinykh видят OP/теги, это классы BouncyCastle. –

+0

Тэги не относятся к классу, они относятся ко всему вопросу, иногда по усмотрению плаката, очень тангенциально. Это не редкость для ответа на вопрос, но не связанного с одним или несколькими тегами вопроса. Читая этот фрагмент кода, или, копируя и вставляя его в VS, остается по-прежнему задаваться вопросом, на что следует ссылаться, чтобы это работало. Например, если вы ссылаетесь на [этот пакет nuget] (https://www.nuget.org/packages/BouncyCastle-PCL), он НЕ работает. Следовательно, этот ответ можно было бы улучшить, указав точно, на что должны ссылаться сборки/пакеты и пространства имен. –

0
private static void CreateToken(string message, string key) 
    { 
     System.Text.ASCIIEncoding encoding = new System.Text.ASCIIEncoding(); 
     byte[]keyByte = encoding.GetBytes(key); 


     HMACSHA256 hmacsha = new HMACSHA256(keyByte); 
     byte[]messageBytes = encoding.GetBytes(message); 

     byte[]hashmessage = hmacsha.ComputeHash(messageBytes); 
     Console.WriteLine(ByteToString(hashmessage)); 
    } 
    public static string ByteToString(byte[]buff) { 
     string sbinary = ""; 

     for (int i = 0; i < buff.Length; i++) { 
      sbinary += buff[i].ToString("X2"); // hex format 
     } 
     return (sbinary); 
    } 

Над кодом сохранены мое время, работая на HMAC -SHA256, надеюсь, это может помочь кому-то, и здесь приводится подробная информация http://billatnapier.com/security01.aspx

1

Использование этого ответвления PCL от BouncyCastle https://www.nuget.org/packages/BouncyCastle-PCL/1.0.0.6 действительно просто, фактически идентично окнам api.

public string ComputeHMAC(string message) 
    { 
     var keyBytes = Encoding.UTF8.GetBytes(Constants.API_KEY); 
     var messageBytes = Encoding.UTF8.GetBytes(message); 

     var hmac = new HMACSHA256(keyBytes); 
     byte[] result = hmac.ComputeHash(messageBytes); 

     return Convert.ToBase64String(result); 
    } 

И модульное тестирование с использованием фактической версии .Net:

[Test, AutoMoqData] 
    public void Hash_Algorithm_Correct (
     [NoAutoProperties] HashMacService sut, 
     string message) 
    { 
     string expected; 

     var key = Encoding.UTF8.GetBytes(Constants.API_KEY); 

     using (var hmac = new HMACSHA256(key)) 
     { 
      var hash = hmac.ComputeHash(Encoding.UTF8.GetBytes(message)); 
      expected = Convert.ToBase64String(hash); 
     } 

     var result = sut.ComputeHMAC(message); 

     Assert.That(result, Is.EqualTo(expected)); 
    } 

Я использовал PCLCrypto но терпел крах на Xamarin прошивке, это было гораздо чище, и может быть протестировано, требуется PCLCrypto Тогда как платформа apis должна была быть развернута на устройстве.

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