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