2011-07-13 8 views
3

Javaで以下のことを行うことに問題があります。以下は私が使用しているツールのドキュメントのFantomコードです。SHA1を使用したFantom HMACのJava同等版

// compute salted hmac 
hmac := Buf().print("$username:$userSalt").hmac("SHA-1", password.toBuf).toBase64 

// now compute login digest using nonce 
digest := "${hmac}:${nonce}".toBuf.toDigest("SHA-1").toBase64 

// our example variables 
username: "jack" 
password: "pass" 
userSalt: "6s6Q5Rn0xZP0LPf89bNdv+65EmMUrTsey2fIhim/wKU=" 
nonce: "3da210bdb1163d0d41d3c516314cbd6e" 
hmac:  "IjJOApgvDoVDk9J6NiyWdktItl0=" 
digest: "t/nzXF3n0zzH4JhXtihT8FC1N3s=" 

私はGoogleを通じてさまざまな例を探していますが、ドキュメントの主張が返された結果はありません。

ドキュメントの例が正しいかどうかをFantomの知識がある人が確認できますか?私は私が手

jack:6s6Q5Rn0xZP0LPf89bNdv+65EmMUrTsey2fIhim/wKU= 
pass 

次のパラメータを使用してメソッドを呼び出すときJava側については

は、ここでは、しかし、私の最も最近の試み

public static String hmacSha1(String value, String key) { 
    try { 
     // Get an hmac_sha1 key from the raw key bytes 
     byte[] keyBytes = key.getBytes("UTF-8");   
     SecretKeySpec signingKey = new SecretKeySpec(keyBytes, "HmacSHA1"); 

     // Get an hmac_sha1 Mac instance and initialize with the signing key 
     Mac mac = Mac.getInstance("HmacSHA1"); 
     mac.init(signingKey); 

     // Compute the hmac on input data bytes 
     byte[] rawHmac = mac.doFinal(value.getBytes("UTF-8")); 

     // Convert raw bytes to Hex 
     byte[] hexBytes = new Hex().encode(rawHmac); 

     // Covert array of Hex bytes to a String 
     return new String(hexBytes, "UTF-8"); 
    } catch (Exception e) { 
     throw new RuntimeException(e); 
    } 
} 

ある

22324e02982f0e854393d27a362c96764b48b65d 

答えて

1

それは知識のちょうど私自身の不足だったと十分に試行錯誤して、私は次の操作を行って、それを把握することができたが判明:

//username: "jack" 
//password: "pass" 
//userSalt: "6s6Q5Rn0xZP0LPf89bNdv+65EmMUrTsey2fIhim/wKU=" 
//nonce: "3da210bdb1163d0d41d3c516314cbd6e" 
//hmac:  "IjJOApgvDoVDk9J6NiyWdktItl0=" 
//digest: "t/nzXF3n0zzH4JhXtihT8FC1N3s=" 

... 
// initialize a Mac instance using a signing key from the password 
SecretKeySpec signingKey = new SecretKeySpec(password.getBytes(), "HmacSHA1"); 
Mac mac = Mac.getInstance("HmacSHA1"); 
mac.init(signingKey); 

// compute salted hmac 
byte[] hmacByteArray = mac.doFinal((username + ':' + userSalt).getBytes()); 
String hmacString = new String(Base64.encodeBase64(hmacByteArray)); 
// hmacString == hmac 

// now compute login digest using nonce 
MessageDigest md = MessageDigest.getInstance("SHA-1"); 
md.update((hmacString + ':' + nonce).getBytes()); 
byte[] digestByteArray = md.digest(); 
String digestString = new String(Base64.encodeBase64(digestByteArray)); 
// digestString == digest 

使用済みorg.apache.commons.codec.binary。バイト配列をエンコードするためのBase64。

2

ドキュメントがどこから来たのかわからない - 古いかもしれない - または間違っている可能性があります。私は実際にあなたが正しいものをテストしていることを確認するために参照として使用するためのFantomコードを実行します。

あなたはSYSのJavaソースを見てみることができます):: Buf.hmac:MemBuf.java

私はまた、3つの変換を分離することをお勧めします。生のバイト配列がFantomとJavaの両方で一致していることを確認し、ダイジェストが一致していることを確認し、最後にBase64エンコーディングを確認します。コードの各段階を簡単に確認できるようにしてください。

関連する問題