.NETとC#を使用して、HMAC SHA512を使用して整合性文字列をPHP serverに提供する必要があります。C#での使用:
Encoding encoding = Encoding.UTF8;
byte[] keyByte = encoding.GetBytes(key);
HMACSHA512 hmacsha512 = new HMACSHA512(keyByte);
byte[] messageBytes = encoding.GetBytes(message);
byte[] hashmessage = hmacsha512.ComputeHash(messageBytes);
return(ByteToString(hashmessage).toUpper());
しかし、PHP hash_hmac()PHP codeとは一致しません:
$hmac = strtoupper(hash_hmac($pbx_hash, $msg, $binKey));
C#(utf8、ASCII、Unicode)でエンコーディングを変更しようとしましたが、成功しませんでした。
私はネットで見つかった多くの解決策を試しましたが、同じ文字列を与えるものはありません:(
PHPコードを変更できません。C#の何が問題なのかわかりません。
編集これはByteToString
です(コメントからコピー):
static string ByteToString(byte[] buff)
{
string sbinary = "";
for (int i = 0; i < buff.Length; i++)
{
sbinary += buff[i].ToString("X2"); /* hex format */
}
return (sbinary);
}
多くのテットの後、PHP hash_hmacキーがバイト配列ではなく文字列である場合、同じ結果が得られることがわかりました。問題はPHP =変換関数$ binKey = pack( "H *"、$ keyTest);
問題は、キー/メッセージデータの実際の表現である必要があります。
次のテストを参照してください。
PHP
#!/usr/bin/php
<?php
print strtoupper(hash_hmac("sha256", "message", "key"));
?>
出力( 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;
}
}
出力( http://ideone.com/JdpeL でライブ):
Result: 6E9EF29B75FFFC5B7ABAE527D58FDADB2FE42E7219011976917343065F58ED4A
PHP入力データの文字セット/エンコーディングを確認してください。実際のアルゴリズムも確認してください($pbx_hash
)。
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);
}
}
上で述べたように、問題はPHP Pack(H *関数はキーをバイト配列に変換するために使用されます。C#Getbytesは同じ結果(utf8、asci、unicode ...) 。ここで見つかった解決策: http://www.nuronconsulting.com/c-pack-h.aspx は問題ありませんでした。C#のHMACが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;
}
あなたの助けをみんなに感謝します。