使用BouncyCastle

时间:2016-04-26 22:06:08

标签: c# .net bouncycastle sha256 hmac

我需要在PCL(为Xamarin Forms开发)中生成一个HMAC-SHA256哈希,它不支持.NET内置的HMAC /加密类,所以我正在与BouncyCastle一起实现我的加密课程。

我需要生成一个HMAC-SHA256哈希,但我还没有在Google上找到任何示例,BouncyCastle似乎也没有任何相关文档。任何人都可以帮助我吗?

3 个答案:

答案 0 :(得分:6)

感谢解决方案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);
    }
}

答案 1 :(得分:2)

使用BouncyCastle https://www.nuget.org/packages/BouncyCastle-PCL/1.0.0.6的这个PCL分支,它非常简单,实际上与windows 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 iOS上崩溃,这更加清晰,可以进行单元测试,而PCLCrypto需要平台apis,因此必须部署到设备上。

答案 2 :(得分: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