我需要从这个字符串构建一个授权哈希:
kki98hkl-u5d0-w96i-62dp-xpmr6xlvfnjz:20151110171858:b2c13532-3416-47d9-8592-a541c208f755:hKSeRD98BHngrNa51Q2IgAXtoZ8oYebgY4vQHEYjlmzN9KSbAVTRvQkUPsjOGu4F
这个密钥用于HMAC哈希函数:
LRH9CAkNs-zoU3hxHbrtY0CUUcmqzibPeN7x6-vwNWQ=
我需要生成的授权哈希是这样的:
P-WgZ8CqV51aI-3TncZj5CpSZh98PjZTYxrvxkmQYmI=
需要注意以下几点:
- 签名必须采用HMAC-SHA-256,如RFC 2104中所规定。
- 签名必须采用Base64 URL兼容编码,如RFC 4648 Section 5(安全字母表)中所规定。
还有一些伪代码可以用于生成:
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个字符是正确的。请帮我找出错误,这个简单的问题花费了我数小时,但没有解决方案。
base64url_encode
。如果出于任何原因您需要对其进行urlencode,请在验证之前在服务器上使用urlencode
和urldecode
。 - Charlotte Dunois