c# - 如何像在 PHP 示例中一样在 C# 中创建哈希?
问题描述
我必须将此 php 代码重写为 c#
$sign_params = ['name'=>"John", 'age'=>18];
$client_secret = 'test secret key';
ksort($sign_params); // Sort array by keys
$sign_params_query = http_build_query($sign_params); // Forming string like "param_name1=value¶m_name2=value"
$sign = rtrim(strtr(base64_encode(hash_hmac('sha256', $sign_params_query, $client_secret, true)), '+/', '-_'), '='); // get hash code
return $sign;
这是我尝试的:
public class apiHelper : MonoBehaviour
{
const string client_secret = "test secret key";
public static string checkSign(Dictionary<string, dynamic> fields)
{
//* sort by keys
var list = fields.Keys.ToList();
list.Sort();
string sign_params_query = "";
//* forming string like "param_name1=value¶m_name2=value"
foreach (var key in list)
{
sign_params_query = sign_params_query + key + "=" + fields[key];
if (key != list.Last()) sign_params_query = sign_params_query + "&";
}
//* get hash code
string sign = System.Convert.ToBase64String(GetHash(sign_params_query, client_secret));
char[] charsToTrim = { '=' };
return sign.Replace("+", "-").TrimEnd(charsToTrim);
}
static byte[] GetHash(string url, string key)
{
using (HMACSHA256 hmac = new HMACSHA256(Encoding.ASCII.GetBytes(key)))
{
byte[] data = hmac.ComputeHash(Encoding.UTF8.GetBytes(url));
return data;
}
}
}
好吧,最后我得到了与 php 示例中不同的哈希值 ._。我做错了什么?这是我第一次使用加密或类似的东西
解决方案
好吧,带有特殊字符的字符串的问题。我必须使用 url_encode c# 等效来解决它。
推荐阅读
- android - Android In App Billing 检查是否测试购买
- python - 使用 zfit 从带有剪切的 ROOT 文件导入数据集
- c - for 循环中的变量声明 - Intellisense 坚持 C89 标准?
- dart - RxDart shareReplay 不“热”?
- ios - 从 UISearchBar 设置搜索 Texfield 文本颜色
- java - Visual Studio Code 中的 Corda 支持问题
- apache - 无法根据 Apache 虚拟主机中的路径位置编辑身份验证标头?
- matlab - 将 MATLAB 表中的零值更改为空值
- javascript - 将数组分成两个数组并将值设置为奇数和偶数
- git - git 合并后缺少代码。提交存在,但未显示在文件更改中。我们如何才能恢复更改?