[英]Convert C# hashing function into PHP
我在C#中有以下函數,我需要將其轉換為PHP的哈希函數。 我已經在PHP中嘗試了一些方法,但沒有得到相同的結果(.NET一點也不好)
private static string GetSignature(string args, string privatekey)
{
var encoding = new System.Text.ASCIIEncoding();
byte[] key = encoding.GetBytes(privatekey);
var myhmacsha256 = new HMACSHA256(key);
byte[] hashValue = myhmacsha256.ComputeHash(encoding.GetBytes(args));
string hmac64 = Convert.ToBase64String(hashValue);
myhmacsha256.Clear();
return hmac64;
}
在PHP中的一次(錯誤)嘗試是:
function encode($data,$key)
{
return base64_encode( hash_hmac('sha256', $data, $key ) );
}
答案
DampeS8N在下面建議的內容略有變化對我有用。
function encode($data,$key)
{
iconv_set_encoding("input_encoding", "ASCII");
iconv_set_encoding("internal_encoding", "ASCII");
iconv_set_encoding("output_encoding", "ASCII");
return base64_encode( hash_hmac('sha256', $data, $key, true ) );
}
也請不要使用hash_hmac的第四個參數-現在將原始輸出作為二進制數據設置為true
我懷疑您的.net代碼的第一行是罪魁禍首。 PHP 沒有針對字符串本身的編碼 ,因此,當需要進行哈希處理時,它要么對內部PHP字符串格式的字節進行哈希處理(不太可能,其他人可以確認嗎?),或者很有可能首先轉換為其他內容。 在這種情況下,Unicode可能與.net請求的ASCII字符串的字節數明顯不同。
我的建議是確保PHP也使用帶有iconv的 ASCII來實現互操作性。
function encode($data,$key)
{
return base64_encode( hash_hmac('sha256', iconv( iconv_get_encoding( "internal_encoding"), "ASCII", $data ), iconv( iconv_get_encoding( "internal_encoding"), "ASCII", $key ) ) );
}
我不確定上面的代碼會輸出所需的哈希值,但是,因為我沒有.net可以方便地測試初始代碼。 但這可能會為您指明正確的方向。
如果這不起作用,則iconv_get_encoding(
內的值可能是罪魁禍首,也可以嘗試使用"output_encoding"
或"input_encoding"
。還可能需要使用iconv_set_encoding(
將這些相同的值設置為ASCII。
祝好運!
更新! 這是最終有效的方法:
function encode($data,$key)
{
iconv_set_encoding("input_encoding", "ASCII");
iconv_set_encoding("internal_encoding", "ASCII");
iconv_set_encoding("output_encoding", "ASCII");
return base64_encode( hash_hmac('sha256', $data, $key, true ) );
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.