加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

将C#散列函数转换为PHP

发布时间:2020-12-15 07:58:36 所属栏目:百科 来源:网络整理
导读:我在C#中有以下函数,一个我需要转换为 PHP的散列函数.我在 PHP中尝试过一些东西,但是我没有得到相同的结果(我对.NET不太满意) private static string GetSignature(string args,string privatekey){ var encoding = new System.Text.ASCIIEncoding(); byte[]
我在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',$key,true ) );
}

请不要使用hash_hmac的第四个参数 – 现在将原始输出设置为true作为二进制数据

解决方法

我怀疑你的.net代码的第一行是罪魁祸首. PHP has no encoding for the string本身,所以当它需要哈希时,它是散列内部PHP字符串格式的字节(不太可能,其他人可以确认吗?)或者更可能首先转换为其他东西.在这种情况下,可能是unicode,它绝对不是字符串与.net请求的字符串相同的字节.

我的建议是确保PHP也使用ASCII,with iconv,以实现互操作性.

function encode($data,iconv( iconv_get_encoding( "internal_encoding"),"ASCII",$data ),$key ) ) );
}

我不能确定上面的代码会输出所需的哈希值,但是,因为我没有.net方便测试初始代码.但这可能会指向正确的方向.

如果这不起作用,iconv_get_encoding中的值(可能是罪魁祸首,请尝试“output_encoding”或“input_encoding”.您也可能需要使用iconv_set_encoding(.)将这些相同的值设置为ASCII.

祝好运!

更新!这是最终奏效的:

function encode($data,true ) );
}

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读