C# equivalent to hash_hmac in PHP

前端 未结 3 1015
盖世英雄少女心
盖世英雄少女心 2020-12-01 06:38

using .NET and C# i need to provide an integrity string using HMAC SHA512 to a PHP server . Using in C# :

Encoding encoding = Encoding.UTF8;
byte[] keyByte          


        
相关标签:
3条回答
  • 2020-12-01 06:56

    The problem must be the actual representation of the key/message data.

    See the following tests:

    PHP

    #!/usr/bin/php
    <?php
    print strtoupper(hash_hmac("sha256", "message", "key"));
    ?>
    

    Output (live via http://writecodeonline.com/php/):

    6E9EF29B75FFFC5B7ABAE527D58FDADB2FE42E7219011976917343065F58ED4A
    

    C#

    using System;
    using System.Text;
    using System.Security.Cryptography;
    
    public class Program
    {
        private const string key = "key";
        private const string message = "message";
        private static readonly Encoding encoding = Encoding.UTF8; 
    
        static void Main(string[] args)
        {
            var keyByte = encoding.GetBytes(key);
            using (var hmacsha256 = new HMACSHA256(keyByte))
            {
                hmacsha256.ComputeHash(encoding.GetBytes(message));
    
                Console.WriteLine("Result: {0}", ByteToString(hmacsha256.Hash));
            }
        }
        static string ByteToString(byte[] buff)
        {
            string sbinary = "";
            for (int i = 0; i < buff.Length; i++)
                sbinary += buff[i].ToString("X2"); /* hex format */
            return sbinary;
        }    
    }
    

    Output (live via http://ideone.com/JdpeL):

    Result: 6E9EF29B75FFFC5B7ABAE527D58FDADB2FE42E7219011976917343065F58ED4A
    

    So, check the character set/encoding of the PHP input data. Also check the actual algorithm (in $pbx_hash).

    0 讨论(0)
  • 2020-12-01 07:00
        private static string HashHmac(string message, string secret)
        {
            Encoding encoding = Encoding.UTF8;
            using (HMACSHA512 hmac = new HMACSHA512(encoding.GetBytes(secret)))
            {
                var msg = encoding.GetBytes(message);
                var hash = hmac.ComputeHash(msg);
                return BitConverter.ToString(hash).ToLower().Replace("-", string.Empty);
            }
        }
    
    0 讨论(0)
  • 2020-12-01 07:15

    As said upper, the problem was with PHP Pack(H* function used to convert key to byte array. C# Getbytes doesn't give the same result (utf8, asci, unicode...). The solution found here : http://www.nuronconsulting.com/c-pack-h.aspx was ok for me. now HMAC from C# match with PHP !

    public static byte[] PackH(string hex)
    {
           if ((hex.Length % 2) == 1) hex += '0';
           byte[] bytes = new byte[hex.Length / 2];
           for (int i = 0; i < hex.Length; i += 2)
           {
                 bytes[i / 2] = Convert.ToByte(hex.Substring(i, 2), 16);
           }
     return bytes;
    }
    

    Manu thanks to all for your help.

    0 讨论(0)
提交回复
热议问题