【发布时间】:2013-06-18 12:53:46
【问题描述】:
我正在尝试在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());No Secret Key?,使用的密钥是什么?
任何资源或帮助将不胜感激。 我在 SO 上尝试了other 答案的变体,但没有任何乐趣。
我可以在线某处运行这 3 行代码吗(例如 JSFiddle 但对于 C#?)以便我可以看到每一行的输出?
更新 - 添加赏金
仍然遇到这个问题,我设法在 Visual Studio 中测试了 C# 代码,但在获取 PHP 中生成的相同哈希时遇到了麻烦。
我想要...
.. 上面的C# 代码(特别是创建SHA1 哈希的3 行)将转换为PHP(查看我在上面发布的Pseudo Code)。我应该能够使用 PHP 匹配 C# 哈希。
如果您有任何其他问题,请提出。
【问题讨论】:
-
您是否阅读了有关您提出的任何问题的文档? 1) ComputeHash 对字节数组进行散列,在本例中使用 HMACSHA1。 2) Encoding.ASCII.GetBytes 返回字符串,以 ASCII 编码(作为字节)。 3) 您正在为 HMACSHA1 的构造函数提供密钥。
-
var apiToken = "E1024763-1234-5678-91E0-T32E4E7EB316";有错别字吗? GUID 不能有“T” - 全部是十六进制 :)
-
@JonSkeet 我在问这个问题后很快就发现了,我的麻烦是在 PHP 中做同样的事情,我知道我需要 hash_hmac 函数,但不知道我需要 hexdec,现在考虑这个,这个只是一个与 PHP 相关的问题,
-
我只是想掩盖我私人的,我用一些随机字符替换它,你的眼睛很敏锐;)