猿问

C# HMACSHA256 在 PHP 中等效

我正在尝试使用hash_hmac sha256来创建数字签名,php但问题是结果与api使用C#. 这是C#代码:


public static String createSignature(string apiSecret, long nonce, string customerId, string apiKey)

{

    byte[] keyBytes = StringToByteArray(apiSecret);


    using (HMACSHA256 hmac = new HMACSHA256(keyBytes))

    {

        byte[] data = hmac.ComputeHash(Encoding.UTF8.GetBytes(nonce + customerId + apiKey));

        return bytesToHex(data);

    }

}


public static String bytesToHex(byte[] bytes)

{

    char[] hexArray = new char[] { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F' };

    char[] hexChars = new char[bytes.Length * 2];


    for (int j = 0; j < bytes.Length; ++j)

    {

        int v = bytes[j] & 255;

        hexChars[j * 2] = hexArray[(uint)v >> 4];

        hexChars[j * 2 + 1] = hexArray[v & 15];

    }


    return new String(hexChars);

}


public static byte[] StringToByteArray(string hex)

{

    return Enumerable.Range(0, hex.Length)

                     .Where(x => x % 2 == 0)

                     .Select(x => Convert.ToByte(hex.Substring(x, 2), 16))

                     .ToArray();

}

这是我的php代码:


$string = $nonce.$customer.$api_key;

$signature = hash_hmac("sha256", utf8_encode($string), utf8_encode($api_secret));

我只能更改php代码以匹配C#结果。到目前为止,我使用utf8_encode,base64_encode和 simplestring作为hash_hmacfuncton 中的输入,它们的结果都与C#版本不同。

注:测试我使用固定nonce,customer并api_key与secret在php和C#

PS:我知道有有关这个问题的现场工作解决多个问题。我尝试了其中的大部分,但没有一个对我有用。


忽然笑
浏览 198回答 1
1回答

跃然一笑

这应该可以解决问题:string result = createSignature("AABBCC", 0, "1", "mykey");// FFB95E1E991734F1C2AE0B7C7ACECFAA5D3BEE943189539C3439B344A9A82E39Console.WriteLine(result);<?php$nonce = 0;$customer = '1';$api_key = 'mykey';$api_secret = hex2bin('AABBCC');$string = $nonce . $customer . $api_key;$signature = strtoupper(hash_hmac('sha256', $string, $api_secret));// FFB95E1E991734F1C2AE0B7C7ACECFAA5D3BEE943189539C3439B344A9A82E39echo $signature;
随时随地看视频慕课网APP
我要回答