2010-06-26 3 views
9

일부 Google지도 고급형 API 작업을 설정하려고합니다. 인증을 위해 URL에 서명해야합니다. Signature 예제로 가면 HMAC-SHA1을 통해 서명을 수행하는 방법을 보여주는 Python, C# 및 Java 코드가 있습니다. PHP 구현을 테스트 할 수있는 예제도 있습니다. 그러나, 나는 단지 그것이 작동하도록 할 수 없습니다. 완전히 일치하지 않는PHP로 HMAC-SHA1을 통해 디지털로 서명하려고 시도했습니다.

ZDRlNGMwZjIyMTA1MWM1Zjk0Nzc4M2NkYjlmNDQzNDBkYzk4NDI4Zg== 

:이 프로그램을 실행할 때, 나는의 서명을받을

$key = "vNIXE0xscrmjlyV-12Nj_BvUPaw="; 

$data = "/maps/api/geocode/json?address=New+York&sensor=false&client=clientID"; 

$my_sign = hash_hmac("sha1", $data, base64_decode($key)); 
$my_sign = base64_encode($my_sign); 

$valid_sign = "KrU1TzVQM7Ur0i8i7K3huiw3MsA="; 

:

여기 내 코드입니다.

것들 나는 생각했다 :

  1. 의 핵심은 너무도
  2. 파이썬 예제 코드는 실제로 작동합니까 작동하지 않습니다 +/-_을 변경, 수정 된 URL 인코딩 형식으로되어 있습니다, 그래서 이것은 유효한 예제입니다.
  3. 우리의 코드베이스를 PHP 대신 파이썬으로 완전히 다시 작성했습니다 (상속했습니다).

답변

20

당신은 2 문제 이상,

  1. 구글은 특별한 URL 보안 base64를 사용합니다. 정상 base64_decode가 작동하지 않습니다.
  2. SHA1을 바이너리로 생성해야합니다.

이 시도,

$key = "vNIXE0xscrmjlyV-12Nj_BvUPaw="; 
$data = "/maps/api/geocode/json?address=New+York&sensor=false&client=clientID"; 
$my_sign = hash_hmac("sha1", $data, base64_decode(strtr($key, '-_', '+/')), true); 
$my_sign = strtr(base64_encode($my_sign), '+/', '-_'); 
+0

에서 확인할 수있다. 나는이 두 문자를 수동으로 바꾸려고 시도했지만 여전히 정확한 결과를 볼 수 없다는 것을 맹세한다. 아마 그것은 맞지 않았을 것입니다. 어쨌든 귀하의 도움에 감사드립니다! :) – Conradaroma

+4

@ZZCoder 당신의 예제는 오늘날에도 여전히 유용합니다. Amazon S3 버킷 요청에 서명하는 것은 매우 유사합니다. '$ signature = rawurlencode (base64_encode (hash_hmac ("sha1", $ stringToSign, $ secret_access_key, true))); –

+0

rawurlencode 함수를 사용하지 않을 때 Geek Stocks의 S3 업로드 제안이 작동합니다. 이 업로드 솔루션에는 라이브러리를 사용하지 않고 사용할 수있는 훌륭한 S3/PHP 정보가 있습니다. http://www.plupload.com/docs/v2/Upload-to-Amazon-S3 – Exit

관련 문제