【问题标题】:Get Ruby's OpenSSL::HMAC.hexdigest() to output the same as PHP's hash_hmac()获取 Ruby 的 OpenSSL::HMAC.hexdigest() 以输出与 PHP 的 hash_hmac() 相同的结果
【发布时间】:2011-03-19 04:19:28
【问题描述】:

我正在尝试使用网络服务提供商的 API。他们在 Ruby 中没有示例,但他们确实有一个用于 PHP 的示例,我试图在两者之间进行解释。 API 示例在 PHP 的 hash_hmac() 调用中始终使用“true”,这会产生二进制输出。不同之处似乎在于 Ruby 的 OpenSSL::HMAC.hexdigest() 函数总是返回文本。 (如果我将 PHP 调用更改为“false”,它们会返回相同的值。)有谁知道“编码”从 OpenSSL::HMAC.hexdigest() 返回的文本以获得与从 hash_hmac 返回相同的东西的方法('sha256', $text, $key, true)?

【问题讨论】:

    标签: php ruby


    【解决方案1】:

    使用OpenSSL::HMAC.digest 获取二进制输出。

    【讨论】:

    • 当然,我第一次直接研究 Ruby 手册以了解如何将十六进制字符转换为字节,但从未想过要真正查看相关类。用这个,不是我的。 :)
    • @Charles – 我也是,但我搜索了digest,找到了它,然后盯着它看了几分钟,想知道为什么它不起作用,然后才意识到 OP 正在使用 @987654323 @ :)
    • 好吧,至少我现在也不会因为错过它而感到难过。 ;-)
    【解决方案2】:

    您需要将每对十六进制数字转换为具有相同值的字节。我不知道任何 Ruby,但这类似于它在 PHP 中的处理方式。

    首先,获取您的十六进制数字字符串并将它们拆分为一个数组。数组中的每个元素应该是两个字符长。将每个元素从两个十六进制字节的字符串转换为整数。看起来您可以通过对每个字符串调用 hex 方法来做到这一点。

    接下来,使用参数c* 对转换后的数组调用pack,将每个整数转换为一个字节字符。结果应该是正确的字节串。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-12-10
      • 1970-01-01
      • 1970-01-01
      • 2012-08-19
      • 1970-01-01
      • 1970-01-01
      • 2015-06-27
      • 2011-01-22
      相关资源
      最近更新 更多