c# - 尝试为 api 创建等效于 C# 签名哈希方法的 php

标签 c# php sha1 hmac

我正在尝试复制用于生成签名哈希以与 API 通信的 c# 方法,但无法根据我提供的 c# 方法示例在 PHP 中重现相同的示例结果。

我正在尝试做的单词问题版本是:(来自 api 文档)

计算请求签名

一个请求签名,一个带有 SHA-1 散列码的 HMAC,是通过按顺序连接服务、方法和时间戳参数的值来计算的,然后计算一个符合 RFC 2104 的 HMAC,使用 Secret Access Key 为“ key ”。计算出的 HMAC 值必须是 base64 编码的

测试数据:

service_name = “Zoyto Fulfillment Service”
timestamp: “2010-07-21T04:33:55Z”
api_secret = “2c0774063f4bb1a10ca39ba6c806636a57d78dc3”
method = “getOrderStatus”

Result should be:
signature: “mlePFDcrTAxd+PWA6hOGGtvu2Zc=”

我有以下 C# 方法代码示例,用于创建签名哈希以进行 API 调用:

public string createSignature(string api_secret, string method, string timestamp, string service_name) { 
  DateTime currentTime = DateTime.UtcNow; string toSign = service_name.ToLower() +   method.ToLower() + timestamp.ToLower(); 
  byte[] toSignBytes = Encoding.UTF8.GetBytes(toSign); byte[] secretBytes = Encoding.UTF8.GetBytes(api_secret); 
  HMAC signer = new HMACSHA1(secretBytes byte[] sigBytes = signer.ComputeHash(toSignBytes); 
  string signature = Convert.ToBase64String(sigBytes); 
  return signature; 
}

目前,我的 php 方法如下所示:

$testSecret = '2c0774063f4bb1a10ca39ba6c806636a57d78dc3';
$testSvc    = 'Zoyto Fulfillment Service';
$testStamp  = strtotime('2010-07-21 04:33:55');   
$method = 'getOrderStatus';

$sig    = utf8_encode($testSvc.$method.$testStamp);

$hash   = hash_hmac("sha1", $sig, $testSecret, true);

$sig    = base64_encode($hash);
return $sig;

//returns:
//OUhgiIqxngaFm1Rquxm1lZ/3CzE=

感谢任何帮助

最佳答案

我不确定您从何处获得该 C# 代码,但它不起作用。此 PHP 代码将为您提供给定输入所需的输入。

function createSignature($api_secret, $method, $timestamp, $service_name) {
    $toSign = strtolower($service_name) . strtolower($method) . strtolower($timestamp);
    $sig = hash_hmac('sha1', $toSign, $api_secret, true);
    return base64_encode($sig);
}

$api_secret = '2c0774063f4bb1a10ca39ba6c806636a57d78dc3';
$method = 'getOrderStatus';
$timestamp  = '2010-07-21T04:33:55Z'; 
$service_name    = 'Zoyto Fulfillment Service';

echo createSignature($api_secret, $method, $timestamp, $service_name);
// output: mlePFDcrTAxd+PWA6hOGGtvu2Zc=

注意:需要 PHP 5 >= 5.1.2 或 PECL hash >= 1.1

关于c# - 尝试为 api 创建等效于 C# 签名哈希方法的 php,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8129700/

相关文章:

c# - 单击图片框时获取 PixelValue

java - Java 和 C# 中使用 SHA-1 加密 ID 时,C# 有时会返回前面多一个 0 的值

md5 - 在 GPU 上计算单个 MD5 SHA1 哈希值

c# - File.Delete() 在程序完成之前不删除文件

c# - 使用 Web 浏览器控件按类名获取 div 的内容?

c# - 返回唯一值而不删除重复项 - C#

php - 如何加速检查 HTML 中链接的类?

php - PHP 文件中的 CSS 表单边框格式

php - 选择框中的选项没有响应

c++ - 计算大于 400mb 的大文件的 sha-1 或 CRC32 校验和