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 はアルファベットの文字を使用して数字を表します。base64のAは と同じではありませんa。したがってstrtolower()、base64 でエンコードされた文字列で を使用しても、喜びは得られません。

わかった。ツイッターに戻ると、結果は次のようになります。

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

それらは16進数です。これは 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

まず、16 進数の文字列を 2 進数に変換する必要があります。

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