php - PHP 中的 HMAC-SHA-256

标签 php hmac

我必须从这个字符串构建授权散列:

kki98hkl-u5d0-w96i-62dp-xpmr6xlvfnjz:20151110171858:b2c13532-3416-47d9-8592-a541c208f755:hKSeRD98BHngrNa51Q2IgAXtoZ8oYebgY4vQHEYjlmzN9KSbAVTRvQkUPsjOGu4F

此 secret 用于 HMAC 哈希函数:

LRH9CAkNs-zoU3hxHbrtY0CUUcmqzibPeN7x6-vwNWQ=

我必须生成的授权散列是这样的:

P-WgZ8CqV51aI-3TncZj5CpSZh98PjZTYxrvxkmQYmI=

有些事情需要注意:

  1. 必须按照 RFC 2104 中指定的 HMAC-SHA-256 构建签名.
  2. 签名必须按照 RFC 4648 Section 5 中指定的 Base64 URL 兼容编码。 (安全字母表)。

还给出了生成的一些伪代码:

Signatur(Request) = new String(encodeBase64URLCompatible(HMAC-SHA-256(getBytes(Z, "UTF-8"), decodeBase64URLCompatible(getBytes(S, "UTF-8")))), "UTF-8")

我在 PHP 中尝试了各种方法,但还没有找到正确的算法。这是我现在的代码:

if(!function_exists('base64url_encode')){
    function base64url_encode($data) {
        $data = str_replace(array('+', '/'), array('-', '_'), base64_encode($data));
        return $data;
    }
}

$str = "kki98hkl-u5d0-w96i-62dp-xpmr6xlvfnjz:20151110171858:b2c13532-3416-47d9-8592-a541c208f755:hKSeRD98BHngrNa51Q2IgAXtoZ8oYebgY4vQHEYjlmzN9KSbAVTRvQkUPsjOGu4F";
$sec = "LRH9CAkNs-zoU3hxHbrtY0CUUcmqzibPeN7x6-vwNWQ=";
$signature = mhash(MHASH_SHA256, $str, $sec);
$signature = base64url_encode($signature);

if($signature != "P-WgZ8CqV51aI-3TncZj5CpSZh98PjZTYxrvxkmQYmI=")
    echo "wrong: $signature";
else
    echo "correct";

它给出了这个签名:

K9lw3V-k5gOedmVwmO5vC7cOn82JSEXsNguozCAOU2c=

可以看到,44个字符的长度是正确的。请帮我找出错误,这个简单的问题花了我好几个小时,而且还没有解决方案。

最佳答案

有几点需要注意:

  1. 您的 key 是 base64 编码的。在将它与 php 函数一起使用之前,您必须对其进行解码。这是您错过的最重要的事情。
  2. Mhash 已被 Hash 淘汰扩展名。
  3. 您希望以自定义方式对输出进行编码,因此您需要来自 hmac 函数的原始输出(默认情况下,php 将对其进行十六进制编码)。

因此,使用散列扩展这就变成了:

$key = "LRH9CAkNs-zoU3hxHbrtY0CUUcmqzibPeN7x6-vwNWQ=";
$str = "kki98hkl-u5d0-w96i-62dp-xpmr6xlvfnjz:20151110171858:b2c13532-3416-47d9-8592-a541c208f755:hKSeRD98BHngrNa51Q2IgAXtoZ8oYebgY4vQHEYjlmzN9KSbAVTRvQkUPsjOGu4F";

function encode($data) {
    return str_replace(['+', '/'], ['-', '_'], base64_encode($data));
}

function decode($data) {
    return base64_decode(str_replace(['-', '_'], ['+', '/'], $data));
}

$binaryKey = decode($key);

var_dump(encode(hash_hmac("sha256", $str, $binaryKey, true)));

输出:

string(44) "P-WgZ8CqV51aI-3TncZj5CpSZh98PjZTYxrvxkmQYmI="

关于php - PHP 中的 HMAC-SHA-256,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34957002/

相关文章:

php - Yii 中下拉选项的默认值

javascript - TypeError : b. toLowerCase 不是 bootstrap typeahead 插件中的函数

php - PHP 基于 token 的身份验证

java - CryptoJS 加密 HMACSha256 与 Java 不同

authentication - 授权计算机访问Web应用程序

php - 无效的游标状态 - pdo_odbc FreeTDS SQL Server

php - calc_string_size 中遇到意外的 SQL 类型

c# - 如何从考勤机获取数据

objective-c - 带有 NSData 输入 Objective-C 的 HMAC SHA1

java - 如何在Java中输入 "PBKDF2WithHmacSHA1"的 key