什么是.NET函数的等价函数hash_hmac()

时间:2011-11-09 09:41:26

标签: php asp.net encryption hash cryptography

我正在将一些代码从PHP移植到.NET(我不是PHP开发人员),除了以下内容之外,它们看起来都非常简单:

public function hash($message, $secret)
{
    return base64_encode(hash_hmac('sha1', $message, $secret));
}

如何将此功能移植到.NET?

base64编码完成如下,但是如何复制hash_hmac()?

Convert.ToBase64String(System.Text.Encoding.ASCII.GetBytes(tmpString));

谢谢!

3 个答案:

答案 0 :(得分:2)

如果您正在寻找 HMAC ,那么您应该使用派生自[System.Security.Cryptography.HMAC][1]的课程。

  

hash_hmac('sha1',$ message,$ secret)

在这种情况下,它将是[System.Security.Cryptography.HMACSHA1][2]

UPDATE(更简单的代码,不依赖于ASCII)

static string Hash (string message, byte[] secretKey)
{
    using (HMACSHA1 hmac = new HMACSHA1(secretKey))
    {
        return Convert.ToBase64String(
           hmac.ComputeHash(System.Text.UTF8.GetBytes(message));
    }
}

答案 1 :(得分:1)

使用HashAlgorithm,即SHA1CryptoServiceProvider,例如:

byte[] SHA1Hash (byte[] data)
{
    using (var sha1 = new SHA1CryptoServiceProvider()) 
    {
        return sha1.ComputeHash(data);
    }
}

答案 2 :(得分:1)

最后,我设法创建了一个基于HMACSHA1类的解决方案:

private string Hash(string message, byte[] secretKey)
{
    byte[] msgBytes = System.Text.Encoding.UTF8.GetBytes(message);
    byte[] hashBytes;
    using (HMACSHA1 hmac = new HMACSHA1(secretKey))
    { 
        hashBytes = hmac.ComputeHash(msgBytes); 
    }
    var sb = new StringBuilder();
    for (int i = 0; i < hashBytes.Length; i++) 
          sb.Append(hashBytes[i].ToString("x2"));
    string hexString = sb.ToString();
    byte[] toEncodeAsBytes = System.Text.ASCIIEncoding.ASCII.GetBytes(hexString);
    return System.Convert.ToBase64String(toEncodeAsBytes);
}

更新:稍微压缩一下代码 - 不需要这么多辅助函数。