我在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; }
function encode($data,$key) { return base64_encode( hash_hmac('sha256',$data,$key ) ); }
答案
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 ) ); }
原文地址:https://www.jb51.cc/csharp/100166.html
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。