1

我正在编写一个脚本来与 twitter 交谈——除了生成正确的签名之外,一切似乎都很好,我得到了一个访问错误。但是,更改我的变量以匹配 twitter 文档中的变量会产生不同的结果。在https://dev.twitter.com/docs/auth/creating-signature的底部,它说:

For example, the output given the base string and signing key 
given on this page is 
      B6 79 C0 AF 18 F4 E9 C5 87 AB 8E 20 0A CD 4E 48 A9 3F 8C B6

我的代码产生几乎相同的东西——只是没有空格和小写。但是,当我使用 base64_encode() 时,我得到的值与文档 ( tnnArxj06cWHq44gCs1OSKk/jLY=) 中的值不同,即使尝试使用不同的大小写/间距/等:

echo base64_encode('B679C0AF18F4E9C587AB8E200ACD4E48A93F8CB6');
echo strtolower(base64_encode('B679C0AF18F4E9C587AB8E200ACD4E48A93F8CB6'));
echo base64_encode('B6 79 C0 AF 18 F4 E9 C5 87 AB 8E 20 0A CD 4E 48 A9 3F 8C B6');
echo base64_encode(strtolower('B6 79 C0 AF 18 F4 E9 C5 87 AB 8E 20 0A CD 4E 48 A9 3F 8C B6'));

结果:

QjY3OUMwQUYxOEY0RTlDNTg3QUI4RTIwMEFDRDRFNDhBOTNGOENCNg==
qjy3oumwquyxoey0rtldntg3qui4rtiwmefdrdrfndhbotngoencng==
QjYgNzkgQzAgQUYgMTggRjQgRTkgQzUgODcgQUIgOEUgMjAgMEEgQ0QgNEUgNDggQTkgM0YgOEMgQjY=
YjYgNzkgYzAgYWYgMTggZjQgZTkgYzUgODcgYWIgOGUgMjAgMGEgY2QgNGUgNDggYTkgM2YgOGMgYjY=

我在这里遗漏了一些明显的东西吗?

4

2 回答 2

2

你对 Base64 有误解。

Base64 采用任意值 (0-255) 的字节数组,并使用数字 0-9、AZ、az 和 + 和 / 将这些字节编码为可打印的数据字符串。

正如 base10 使用数字 0-9,base2 使用 0 和 1 一样,base64 使用字母表中的字符来表示数字。Abase64 中的 an与a. 因此,您strtolower()在 base64 编码的字符串上使用不会带来任何乐趣。

行。现在回到推特,他们说结果是:

B6 79 C0 AF 18 F4 E9 C5 87 AB 8E 20 0A CD 4E 48 A9 3F 8C B6

这些是十六进制数字。这不是 base64 编码的值。如果你对它进行 base64,你会得到别的东西(更多数据要遵循)。

如果将其放入字符串中,并尝试对字符串进行 base64 编码,您将再次失败。Twitter 并不是说​​“这是你应该得到的字符串”。这就是说,这是你应该得到的字节数组。

弗什泰?


这段代码

$p = pack("C*", 0xB6, 0x79, 0xC0, 0xAF, 0x18, 0xF4, 0xE9, 0xC5, 0x87,
          0xAB, 0x8E, 0x20, 0x0A, 0xCD, 0x4E, 0x48, 0xA9, 0x3F, 0x8C, 0xB6);
$b64 = base64_encode($p);
echo "base64: " . $b64 . "\n";

产量:

base64: tnnArxj06cWHq44gCs1OSKk/jLY=
于 2012-06-24T16:17:43.037 回答
1

您首先需要将十六进制字符串转换为二进制:

$bin = pack('H*', 'B679C0AF18F4E9C587AB8E200ACD4E48A93F8CB6');
var_dump(base64_encode($bin) === 'tnnArxj06cWHq44gCs1OSKk/jLY=');
于 2012-06-24T16:24:51.107 回答