【问题标题】:generate HMAC-SHA1 in C#在 C# 中生成 HMAC-SHA1
【发布时间】:2016-04-29 07:11:59
【问题描述】:

我正在尝试使用 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# 中完全实现上述逻辑。

有什么建议吗?

【问题讨论】:

    标签: c# cryptography


    【解决方案1】:

    上述代码到 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 编码的字符串。

    【讨论】:

      【解决方案2】:

      让它在 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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-05-22
        • 2017-07-08
        • 1970-01-01
        相关资源
        最近更新 更多