2012-03-16 1 views
10

사용자가 API 키를 사용하여 인증 할 수 있도록 Java 코드를 실행하는 Tomcat 서버가 있습니다. 요청은 SHA256으로 만든 HMAC를 사용합니다. 나는 요청을하기 위해 사용하고있는 Ruby 클라이언트를 가지고 있으며, 암호화에 익숙하지 않아 일치하는 HMAC을 생성하기가 어려워지고있다. URL을 안전하게 만들지 않으려 고 노력했으며 일치합니다. 따라서 Ruby 클라이언트가 URL 안전 버전 (Java 코드를 변경할 수 없기 때문에)과 일치하도록하는 방법이 궁금합니다. 끝에 여분의 문자가 있습니다. 모든 도움을 미리 감사드립니다.Ruby에서 Java와 일치하는 안전한 URL 인 SHA256 용 HMAC을 생성하는 방법은 무엇입니까?

Ruby의 경우 1.9.3을 사용하고 Java의 경우 6u31을 아파치의 commons-codec-1.6.jar 라이브러리와 함께 사용하고 있습니다.

코드

루비 :

require "openssl" 
require "base64" 

json_str = "{'community':'LG7B734A', 'login_id':'user1', 'time':'1331928899'}" 
digest = OpenSSL::Digest::Digest.new("sha256") 
key = [ "4cc45e4258121c3fec84147673e1bd88e51b1c177aafcfa2da72bd4655c9f933" ] 
hmac = OpenSSL::HMAC.digest(digest, key.pack("H*"), json_str) 

encoded_url_safe = Base64.urlsafe_encode64(hmac) 
encoded = Base64.encode64(hmac) 

puts("Encoded (Url Safe): " + encoded_url_safe) 
puts("Encoded   : " + encoded) 

자바 :

import org.apache.commons.codec.binary.Base64; 
import org.apache.commons.codec.binary.Hex; 

import javax.crypto.spec.SecretKeySpec; 
import javax.crypto.Mac; 

public class ExampleHMAC 
{ 
    public static void main(String[] args) throws Exception 
    { 
     String key = "4cc45e4258121c3fec84147673e1bd88e51b1c177aafcfa2da72bd4655c9f933"; 
     byte[] keyBytes = Hex.decodeHex(key.toCharArray()); 

     SecretKeySpec keySpec = new SecretKeySpec(keyBytes, "HmacSHA256"); 
     Mac mac = Mac.getInstance("HmacSHA256"); 
     mac.init(keySpec); 

     String jsonStr = "{'community':'LG7B734A', 'login_id':'user1', 'time':'1331928899'}"; 
     byte[] hmacBytes = mac.doFinal(jsonStr.getBytes()); 

     String encodedUrlSafe = Base64.encodeBase64URLSafeString(hmacBytes); 
     String encoded = Base64.encodeBase64String(hmacBytes); 

     System.out.println("Encoded (Url Safe): " + encodedUrlSafe); 
     System.out.println("Encoded   : " + encoded); 
    } 
} 

출력

루비 :

Encoded (Url Safe): QgYLqGm1M4qozdEjGC_CnJ8CdBm2jQpsU85kSWFcjKM= 
Encoded   : QgYLqGm1M4qozdEjGC/CnJ8CdBm2jQpsU85kSWFcjKM= 

자바 :

Encoded (Url Safe): QgYLqGm1M4qozdEjGC_CnJ8CdBm2jQpsU85kSWFcjKM 
Encoded   : QgYLqGm1M4qozdEjGC/CnJ8CdBm2jQpsU85kSWFcjKM= 

답변

6

루비 후행 '='제거하지 않습니다 - 그것은 절대 요구하지 않습니다, 당신은 단지 그들을 제거하는 특정 응용 프로그램에서 바람직 할 수 있음을 주장한다 RFC 4648 읽을 수 . 하지만 그 외에는 Ruby의 URL 안전 인코딩이 Java의 인코딩과 완전히 동일하다는 보장이 있습니다. 내가 필요 정확히 무엇

encoded_url_safe_.gsub!(/=+$/, "") 
+0

:

그래서 당신이 할 수있는 유일한 것은, 당신은 예를 들어 정규식을 사용할 수 후행 '=='를 벗겨이다. RFC 4648에 대한 참조는 매우 유용하고 철저했습니다. 나는 후행 '='이 선택 적이라는 것을 몰랐습니다. 그 정규식 코드를 추가하고 작동합니다. 고맙습니다. – mvalley

관련 문제