我在 php 中有以下代碼: demofunction generateHash($hashSecret,$postData) { ksort($postData); $message=""; $appendAmp=0; foreach($postData as $key => $value) { if (strlen($value) > 0) { if ($appendAmp == 0) { $message .= $key . '=' . $value; $appendAmp = 1; } else { $message .= '&' . $key . "=" . $value; } } } $secret = pack('H*', $hashSecret); return hash_hmac('sha256', $message, $secret);}$postData = array( "cardNum" => "5123456789012346", "cardExp" => 2105, "cardCVC" => 123, "holderName" => "John Doe", "mobileNumber" => "20100000000000");$secureHash= 'C0DF9A7B3819968807A9D4E48D0E65C6';$hashSecret = generateHash($secureHash,$postData);echo $hashSecret;//輸出6975f8f502e5972722a6d8760cc558e7867f36a312a5d336c4ba983dcfb81691 //以及以下c#演示public static void Main(){ Console.Write(CreateToken("cardCVC=123&cardExp=2105&cardNum=5123456789012346&holderName=John Doe&mobileNumber=20100000000000","C0DF9A7B3819968807A9D4E48D0E65C6"));} private static string CreateToken(string message, string secret){ var encoding = new System.Text.UTF8Encoding(); byte[] keyByte = encoding.GetBytes(secret); byte[] messageBytes = encoding.GetBytes(message); using (var hmacsha256 = new HMACSHA256(keyByte)) { byte[] hashmessage = hmacsha256.ComputeHash(messageBytes); return BitConverter.ToString(hashmessage).Replace("-",""); }}//輸出:26FFE2E29513304F96D444CB69210657B4E44E837B7C8E8947C667B344594F18演示我需要修改我的c#代碼以匹配從php生成的值更新:我嘗試過在線 sha 生成器,它給出了我的 C# 結(jié)果
1 回答

慕婉清6462132
TA貢獻1804條經(jīng)驗 獲得超2個贊
經(jīng)過多次試驗,我發(fā)現(xiàn) PHP pack('H*', $hashSecret) 導致結(jié)果不同,所以我添加了以下方法:
public static byte[] Pack(string key)
{
key = key.Replace("-", "");
byte[] raw = new byte[key.Length / 2];
for (int i = 0; i < raw.Length; i++)
{
raw[i] = Convert.ToByte(key.Substring(i * 2, 2), 16);
}
return raw;
}
- 1 回答
- 0 關注
- 351 瀏覽
添加回答
舉報
0/150
提交
取消