簡體   English   中英

將C#哈希函數轉換為PHP

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM