PHP 中的 C# HMACSHA256 等价物
C# HMACSHA256 equivalent in PHP
我正在尝试使用 hash_hmac sha256
在 php
中创建数字签名,但问题是结果不等同于 api
用 [=16= 编写的结果].这是 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
和简单的 string
作为 hash_hmac
函数的输入,它们都与 C#
版本有不同的结果。
注意:为了测试我在[=14=中使用固定的nonce
、customer
和api_key
和secret
] 和 C#
p.s: 我知道网站上有多个关于此主题的问题和可行的解决方案。我尝试了其中的大部分,其中 none 对我有用。
这应该可以解决问题:
string result = createSignature("AABBCC", 0, "1", "mykey");
// FFB95E1E991734F1C2AE0B7C7ACECFAA5D3BEE943189539C3439B344A9A82E39
Console.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));
// FFB95E1E991734F1C2AE0B7C7ACECFAA5D3BEE943189539C3439B344A9A82E39
echo $signature;
我正在尝试使用 hash_hmac sha256
在 php
中创建数字签名,但问题是结果不等同于 api
用 [=16= 编写的结果].这是 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
和简单的 string
作为 hash_hmac
函数的输入,它们都与 C#
版本有不同的结果。
注意:为了测试我在[=14=中使用固定的nonce
、customer
和api_key
和secret
] 和 C#
p.s: 我知道网站上有多个关于此主题的问题和可行的解决方案。我尝试了其中的大部分,其中 none 对我有用。
这应该可以解决问题:
string result = createSignature("AABBCC", 0, "1", "mykey");
// FFB95E1E991734F1C2AE0B7C7ACECFAA5D3BEE943189539C3439B344A9A82E39
Console.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));
// FFB95E1E991734F1C2AE0B7C7ACECFAA5D3BEE943189539C3439B344A9A82E39
echo $signature;