2

我正在使用一个函数来获取字符串值的 HMAC SHA-256 哈希。但是当我在 JavaScript 和 PHP 中对值进行哈希处理时,两种语言计算的哈希值相同,这与 C# 的结果不同。

我搜索了谷歌并尝试了一切,但它不会给我正确的结果。也许我只是错过了一些东西。

    public static string ToHMAC(this string input, string key)
    {
        if (string.IsNullOrEmpty(input))
            throw new ArgumentNullException("input");

        var hasher = new HMACSHA256(Encoding.UTF8.GetBytes(key));
        var data = hasher.ComputeHash(Encoding.UTF8.GetBytes(input));

        return BitConverter.ToString(data).Replace("-", String.Empty).ToLower();
    }

我尝试在控制台应用程序中进行小测试。

class Program
{
    static void Main(string[] args)
    {
        const string input = "testpw1";
        const string token = "9e76fa355b5e4bed910f621f6a5fb971";
        var phash = input.ToSHA();
        Console.WriteLine("Hashed password: " + phash);
        Console.WriteLine("Signed password: " + phash.ToHMAC(token));
        Console.ReadKey();
    }
}

static class Extensions
{
    public static string ToSHA(this string input)
    {
        if (string.IsNullOrEmpty(input))
            throw new ArgumentNullException("input");

        var hasher = new SHA256Managed();
        var data = hasher.ComputeHash(Encoding.UTF8.GetBytes(input));

        return BitConverter.ToString(data).Replace("-", String.Empty).ToLower();
    }

    public static string ToHMAC(this string input, string key)
    {
        if (string.IsNullOrEmpty(input))
            throw new ArgumentNullException("input");

        var hasher = new HMACSHA256(Encoding.UTF8.GetBytes(key));
        var data = hasher.ComputeHash(Encoding.UTF8.GetBytes(input));
        var retval = BitConverter.ToString(data).Replace("-", String.Empty).ToLower();

        return retval;
    }
}

这正是我在 MVC 应用程序中的做法。但不知何故,这些值与 PHP 和 JavaScript 哈希值相同。我真的不明白我做错了什么。

4

0 回答 0