gpt4 book ai didi

c# - 如何在 PHP 中复制此 C# 哈希? (toByteArray(), ComputeHash())

转载 作者:塔克拉玛干 更新时间:2023-11-03 05:41:38 26 4
gpt4 key购买 nike

我正在尝试在 PHP 中复制以下代码,它是我必须与之交互的 API 的示例代码(API 和示例代码在 C# 中,我的应用程序是 PHP 5.3)。我不是 C# 开发人员,因此在执行此操作时遇到了问题。

// C# Code I am trying to replicate in PHP
var apiTokenId = 1887;
var apiToken = "E1024763-1234-5678-91E0-T32E4E7EB316";

// Used to authenticate our request by the API (which is in C#)
var stringToSign = string.Empty;
stringToSign += "POST"+"UserAgent"+"http://api.com/post";

// Here is the issue, How can I do the following 3 lines in PHP?
// No "secret key" provided?.. How do I do this in PHP?
var hmacsha1 = new HMACSHA1(new Guid(apiToken).toByteArray());

// Make a byte array with ASCII encoding.
byte[] byteArray = System.Text.Encoding.ASCII.GetBytes(stringToSign);

// Finally, 'computeHash' of the above (what does this do exactly?!)
var calculatedSignature = Convert.ToBase64String(hmacsha1.ComputeHash(byteArray));

我使用 pack() 尝试了很多变化和其他我在网上找到的功能,但没有任何可比性,我不知道我是否做对了。

任何 C# 开发人员都可以运行上述代码并发布生成的值,以便我可以使用它来检查/测试吗?

我试过检查 MSDN看看这些方法做了什么,但被卡住了(不确定它是否正确,因为我没有什么可以比较的)。

PHP伪代码

// Set vars
$apiToken = 'E1024763-1234-5678-91E0-T32E4E7EB316';
$apiTokenId = '1887';
$stringToSign = "POST"."UserAgent"."http://api.com/post";

// HowTo: Build a `byteArray` of our apiToken? (i think)
// C#: var hmacsha1 = new HMACSHA1(new Guid(apiToken).toByteArray());

// HowTo: Convert our $stringToSign to a ASCII encoded `byteArray`?
// C#: byte[] byteArray = System.Text.Encoding.ASCII.GetBytes(stringToSign);

// HowTo: Generate a base64 string of our (`hmacsha1`.ComputeHash(byteArray))
// C#: var calculatedSignature = Convert.ToBase64String(hmacsha1.ComputeHash(byteArray));

这听起来非常简单直接,但我不确定这些 C# 方法中的一些是做什么的..

这些 C# 方法做什么/返回什么?

  • ComputeHash(byteArray) - 计算出什么?..返回什么?
  • System.Text.Encoding.ASCII.GetBytes(stringToSign); - 这会返回什么?
  • new HMACSHA1(new Guid(apiToken).toByteArray()); 没有 key ?,使用的 key 是什么?

任何资源或帮助将不胜感激。我尝试了 other 的变体回答 SO,但没有快乐。

我可以在某处在线运行这 3 行代码吗(比如 JSFiddle 但对于 C#?)以便我可以看到每行的输出吗?


更新 - 增加赏金

仍然遇到这个问题,我已经设法在 Visual Studio 中测试了 C# 代码,但是在获取 PHP 中生成的相同哈希时遇到了问题。

我想...

.. 上面的 C# 代码(特别是创建 SHA1 散列的 3 行)要转换成 PHP(查看伪代码 我在上面贴过)。我应该能够使用 PHP 匹配 C# 哈希。

如果您有任何其他问题,请提出。

最佳答案

问题是 GUID 的字符串形式颠倒了 GUID 前 3 段中 2 个字符的十六进制数字的顺序。有关详细信息,请参阅示例中的注释:http://msdn.microsoft.com/en-us/library/system.guid.tobytearray.aspx

下面的代码应该可以工作:

$apiTokenId = 1887;
$apiToken = "E1024763-1234-5678-91E0-FF2E4E7EB316";
$stringToSign = '';
$hexStr = str_replace('-','',$apiToken);
$c = explode('-',chunk_split($hexStr,2,'-'));
$hexArr = array($c[3],$c[2],$c[1],$c[0],$c[5],$c[4],$c[7],$c[6],$c[8],$c[9],$c[10],$c[11],$c[12],$c[13],$c[14],$c[15]);
$keyStr = '';
for ($i = 0; $i < 16; ++$i) {
$num = hexdec($hexArr[$i]);
$keyStr .= chr($num);
}
$stringToSign .= "POST" . "UserAgent" . "http://api.com/post";
$hmacsha1 = base64_encode(hash_hmac('sha1',$stringToSign,$keyStr,true));

我已经根据您在上面提供的 C# 代码测试了这段代码,结果是一样的。但是,原始代码中指定的 GUID 无效,因此我不得不稍微更改它。

关于c# - 如何在 PHP 中复制此 C# 哈希? (toByteArray(), ComputeHash()),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17234435/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com