【问题标题】:Creating hex string parameter in query string在查询字符串中创建十六进制字符串参数
【发布时间】:2015-09-30 15:42:55
【问题描述】:

我需要创建一个具有以下结构的查询字符串: https://api.company.com/api/hello.json?app_id=$name&hash=$hash

$hash 变量应该是与我的客户端密码连接的当前挑战字符串的 SHA1。

我通过运行以下 bash 脚本在控制台中测试了我的 api 凭据(这给了我正确的响应)

$ challenge=$(curl -s "http://www.company.com/api/hello.json?app_id=$name" | head -1 | sed 's/.*"challenge": *"\([0-9]*\)".*/\1/')
$ hash=$(printf $challenge$key | openssl dgst -sha1 | sed 's/^.*\([a-f0-9]\{40\}\).*$/\1/')
$ curl "http://www.company.com/api/hello.json?app_id=$name&hash=$hash"

但是,当我尝试使用 PHP 以编程方式重新创建 $hash 变量时,由于哈希参数不正确,身份验证失败。

要创建我使用的 $hash 参数:

$hash = sha1($challenge . $key);

但显然我在这里遗漏了一些东西。我假设 bash 脚本中的表达式:

a-f0-9]\{40\}\).*$/\1/

检查字符串是否为 40 个字符的十六进制字符串,但我不确定如何将其集成到我的 PHP 代码中。

如果我在控制台中检查 $challenge 变量的值,我会得到 9 位数值,例如:244971205,而我的 PHP 脚本中的相同变量具有字符串值。这可能是我的 $hash 参数格式不正确的原因吗?

值得注意的是,如果我使用运行得到的 $hash 变量值

echo "$hash"

在控制台中直接在我的查询字符串中,api 调用成功,但我想以编程方式获得相同的值。

如果有人能指出正确的方向,将不胜感激。

【问题讨论】:

  • 检查您的输入。您确定 PHP 的 $challenge 和 $key 与命令行中的相同吗? var_export() 可以帮忙。
  • 我相信是这样,但会仔细检查。感谢您的提示!
  • 如果我在控制台中检查 $challenge 的值,我会得到 9 位数值,例如:244971205,而我的 PHP 脚本中的相同变量具有字符串值。
  • 在使用 printf | openssl dgst | sed 方法时,我似乎得到了与使用 sha1($challenge . $key) 相同的结果,即使在使用整数和数字字符串的混合时也是如此。您确定$challenge$key 在两者之间是相同的吗?
  • 我注意到,如果在控制台中检查 $challenge 变量的值,我会得到一个 9 位数值,例如:244971205 而我的 PHP 脚本中的同一个变量有一个字符串值,所以看起来像我我在这里错过了一个重要的步骤。

标签: php bash sha


【解决方案1】:

原来我把事情复杂化了。为了获得$challenge 变量的正确值,我实际上需要做的是用json_decode 解析JSON 数据,然后访问保存像$challenge = $obj['object']['property'] 这样的数值的属性。

【讨论】:

    猜你喜欢
    • 2014-03-07
    • 2010-10-04
    • 2019-07-27
    • 2017-03-22
    • 2016-02-26
    • 1970-01-01
    • 1970-01-01
    • 2017-03-04
    • 1970-01-01
    相关资源
    最近更新 更多