52

Javaで Oauth を介して Twitter 承認を取得するアプリの実装を検討しています。最初のステップは、リクエスト トークンの取得です。App EngineのPython の例を次に示します。

コードをテストするために、Python を実行し、Java で出力をチェックしています。ハッシュベースのメッセージ認証コード (HMAC) を生成する Python の例を次に示します。

#!/usr/bin/python

from hashlib import sha1
from hmac import new as hmac

key = "qnscAdgRlkIhAUPY44oiexBKtQbGY0orf7OV1I50"
message = "foo"

print "%s" % hmac(key, message, sha1).digest().encode('base64')[:-1]

出力:

$ ./foo.py
+3h2gpjf4xcynjCGU5lbdMBwGOc=

この例をJavaでどのように複製しますか?

Javaでの HMACの例を見てきました。

try {
    // Generate a key for the HMAC-MD5 keyed-hashing algorithm; see RFC 2104
    // In practice, you would save this key.
    KeyGenerator keyGen = KeyGenerator.getInstance("HmacMD5");
    SecretKey key = keyGen.generateKey();

    // Create a MAC object using HMAC-MD5 and initialize with key
    Mac mac = Mac.getInstance(key.getAlgorithm());
    mac.init(key);

    String str = "This message will be digested";

    // Encode the string into bytes using utf-8 and digest it
    byte[] utf8 = str.getBytes("UTF8");
    byte[] digest = mac.doFinal(utf8);

    // If desired, convert the digest into a string
    String digestB64 = new sun.misc.BASE64Encoder().encode(digest);
} catch (InvalidKeyException e) {
} catch (NoSuchAlgorithmException e) {
} catch (UnsupportedEncodingException e) {
}

javax.crypto.Macを使用していますが、すべて問題ありません。ただし、SecretKeyコンストラクターはバイトとアルゴリズムを使用します。

Python の例のアルゴリズムは何ですか? アルゴリズムなしでJava秘密鍵を作成するにはどうすればよいですか?

4

2 に答える 2

70

HmacSHA1 は、必要なアルゴリズム名のようです:

SecretKeySpec keySpec = new SecretKeySpec(
        "qnscAdgRlkIhAUPY44oiexBKtQbGY0orf7OV1I50".getBytes(),
        "HmacSHA1");

Mac mac = Mac.getInstance("HmacSHA1");
mac.init(keySpec);
byte[] result = mac.doFinal("foo".getBytes());

BASE64Encoder encoder = new BASE64Encoder();
System.out.println(encoder.encode(result));

生成:

+3h2gpjf4xcynjCGU5lbdMBwGOc=

ここでは簡単な実装に使用sun.misc.BASE64Encoderしましたが、おそらく Sun JRE に依存しないものを使用する必要があります。たとえば、Commons Codec の base64-encoderの方が適しています。

于 2010-07-08T22:27:59.997 に答える
26

些細なことですが、hmac(key、message)と同等のものを探している場合は、デフォルトでPythonライブラリがMD5アルゴリズムを使用するため、JavaでHmacMD5アルゴリズムを使用する必要があります。

私はこの正確な問題を抱えていて、この答えが役に立ったのでこれに言及しますが、ダイジェストメソッドがhmac()に渡され、ウサギの穴を下った部分を見逃しました。うまくいけば、この答えは他の人が将来同じことをするのを防ぐでしょう。

例:Python REPL

>>> import hmac
>>> hmac.new("keyValueGoesHere", "secretMessageToHash").hexdigest()
'1a7bb3687962c9e26b2d4c2b833b2bf2'

これは、Javaメソッドと同等です。

import org.apache.commons.codec.binary.Hex;
import javax.crypto.Mac;
import javax.crypto.spec.SecretKeySpec;

public class HashingUtility {
    public static String HMAC_MD5_encode(String key, String message) throws Exception {

        SecretKeySpec keySpec = new SecretKeySpec(
                key.getBytes(),
                "HmacMD5");

        Mac mac = Mac.getInstance("HmacMD5");
        mac.init(keySpec);
        byte[] rawHmac = mac.doFinal(message.getBytes());

        return Hex.encodeHexString(rawHmac);
    }
}

私の例では、.hexdigest()と同等のことをしていることに注意してください

于 2012-06-19T13:43:34.050 に答える