2012-03-16 7 views
10

ユーザーがAPIキーを使用して認証できるようにするJavaコードを実行するTomcatサーバーがあります。要求はSHA256で作成されたHMACを使用します。私はリクエストをするために使用しているRubyクライアントを持っています。暗号化を初めて使用しているので、一致するHMACを生成するのが困難です。 URLを安全にしないようにしてみましたが、それは一致します。だから私は本当に(私はJavaコードを変更することはできませんので)URLセーフ版と一致するようにRubyクライアントを得ることができますかと思っています。最後に余分な=文字があるだけです。助けを前にありがとう。Rubyで生成されたSHA256用のHMACを取得するには、Javaにマッチする安全なURLですか?

Rubyの場合は1.9.3を使用していますが、Javaの場合は6u31をApacheの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) 

のJava:

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= 

のJava:

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

答えて

6

Rubyは末尾に「=」削除されません - それは絶対的な必要条件ではありません、あなたはそれだけで、それらを削除すると、特定の用途において望ましいかもしれないと述べているRFC 4648で読むことができるよう。しかしそれ以外にも、RubyのURL安全なエンコーディングはJavaとまったく同じであることが保証されています。私がまさに必要だ

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

だからあなたがするための唯一のことは、あなたがたとえば、正規表現を使用することができ続く「==」を取り除くです。 RFC 4648への言及は非常に有用で徹底的でした。後ろの '='がオプションであることはわかりませんでした。私は正規表現のコードを追加し、それが動作します。ありがとうございました。 – mvalley

関連する問題