2012-06-24 2 views
1

나는 트위터와 대화 할 수있는 스크립트를 작성 중입니다. 올바른 서명을 생성하는 것부터 액세스 오류가 발생하는 것 외에는 문제가 없습니다. 그러나 트위터 설명서의 변수와 일치하도록 변수를 변경하면 다른 결과가 나타납니다. https://dev.twitter.com/docs/auth/creating-signature의 하단에, 그것은 말한다 :생성 된 OAuth 서명이 Twitter와 다른 이유는 무엇입니까?

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 

내 코드는 거의 같은 것을 생산 - 단지 공간과 소문자 아니오.

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= 

나는()를 base64_encode 때, 난 다른 케이스/간격/등과 노력, 문서 (tnnArxj06cWHq44gCs1OSKk/jLY=)에서와 동일한 값을 얻을하지 않습니다 내가 여기서 뭔가 분명한 것을 놓치고 있니?

+0

Base64로는 대소 문자를 구분 될 수 있습니다. –

+0

"[..] 다른 케이스/공백/등 [...]" – LeonardChallis

답변

2

귀하는 Base64에 대한 오해가 있습니다.

Base64는 모든 값 (0-255)의 바이트 배열을 가져와 0-9, A-Z, a-z 및 +와 /를 사용하여 인쇄 가능한 데이터 문자열로 인코딩합니다.

base10은 숫자 0-9를 사용하고 base2는 0과 1을 사용하는 것처럼 base64는 알파벳의 문자를 사용하여 숫자를 나타냅니다. base64의 Aa과 같지 않습니다. 따라서 base64로 인코딩 된 문자열에서 strtolower()을 사용하면 기쁨을 얻을 수 없습니다.

확인. 이제 다시 트위터에, 그들은 결과가 말한다 :

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

사람들은 16 진수입니다. 이것은 base64로 인코딩 된 값이 아닙니다. base64하면 다른 것을 얻을 수 있습니다 (따라야 할 데이터가 더 많음).

문자열에 넣고 base64 인코딩을 시도하면 다시 실패합니다. 트위터는 "이것은 당신이 가져야 만하는 문자열이다"라고 말하지 않고있다. 말하자면, 이것은 바이트 배열입니다.

Furshtay?


이 코드

$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= 
+0

아 - 그래서 * raw * 출력 hash_hmac() 및 base64_encode() 얻을 수 있습니다. :디 – LeonardChallis

1

당신은 바이너리로 16 진수 문자열을 설정하는 최초의 필요성 :

$bin = pack('H*', 'B679C0AF18F4E9C587AB8E200ACD4E48A93F8CB6'); 
var_dump(base64_encode($bin) === 'tnnArxj06cWHq44gCs1OSKk/jLY='); 
관련 문제