在C#中生成HMAC-SHA1

时间:2016-04-29 07:11:59

标签: c# cryptography

我正在尝试使用C#的REST API。

API创建者为hmac创建提供了以下伪代码。

var key1 = sha1(body);
var key2 = key1 . SECRET_KEY;
var key3 = sha1(key2);
var signature = base64_encode(key3);

在上面的伪代码中,body是html请求体字符串和SECRET_KEY 是REST API提供程序提供的密钥。

据我所知,我需要使用System.Security.Cryptography.HMACSHA1类 实现这一点。

但是我无法在C#中完全实现上述逻辑。

有什么建议吗?

2 个答案:

答案 0 :(得分:2)

将上述代码直接映射到C#将类似于:

static string ComputeSignature(byte[] body, byte[] secret) {
    using (var sha1 = SHA1.Create())
    {
        var key1 = sha1.ComputeHash(body);
        var key2 = key1.Concat(secret).ToArray();
        var key3 = sha1.ComputeHash(key2);
        return Convert.ToBase64String(key3);
    }
}

如果您将请求正文作为字符串,请使用适当的编码将其转换为字节数组,例如:

var body = Encoding.UTF8.GetBytes(bodyAsString);

如果您将秘密作为字符串 - 这取决于api开发人员希望将其转换为字节数组的方式。很可能它已经是HEX或base64编码的字符串。

答案 1 :(得分:0)

使其在c#中工作的问题是,您需要考虑到十六进制格式,然后在某些情况下使其起作用,最终结果应为小写(例如,如果您将它用于quickblox api,则为示例等等)

    private string GetHashedMessage(String _secret)
    {
        System.Text.ASCIIEncoding encoding = new System.Text.ASCIIEncoding();
        byte[] keyByte = encoding.GetBytes(_secret);
        String _message= "Your message that needs to be hashed";
        HMACSHA1 hmacsha1 = new HMACSHA1(keyByte);

        byte[] messageBytes = encoding.GetBytes(_message);
        byte[] hashmessage = hmacsha1.ComputeHash(messageBytes);
        return ByteToString(hashmessage).ToLower();
    }

    public string ByteToString(byte[] buff)
    {
        string sbinary = "";

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

参考:http://billatnapier.com/security01.aspx