java जावा में HMAC को पायथन उदाहरण के बराबर कैसे उत्पन्न करें?




oauth sha1 (2)

मैं जावा में Oauth के माध्यम से ट्विटर प्राधिकरण प्राप्त करने वाले ऐप को लागू करने पर विचार कर रहा हूं। पहले चरण में अनुरोध टोकन मिल रहा है । यहां ऐप इंजन के लिए पायथन उदाहरण है

अपने कोड का परीक्षण करने के लिए, मैं पायथन चला रहा हूं और जावा के साथ आउटपुट की जांच कर रहा हूं। यहाँ हैश-आधारित संदेश प्रमाणीकरण कोड (HMAC) बनाने वाले पायथन का एक उदाहरण दिया गया है:

#!/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=

जावा में कोई इस उदाहरण को कैसे दोहराता है?

मैंने जावा में 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 निर्माता बाइट्स और एक एल्गोरिथ्म लेते हैं।

पायथन उदाहरण में एल्गोरिथ्म क्या है? एल्गोरिथ्म के बिना कोई जावा गुप्त कुंजी कैसे बना सकता है?


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 उपयोग किया है, लेकिन आपको संभवतः कुछ का उपयोग करना चाहिए जो सूर्य JRE पर निर्भर नहीं करता है। कॉमन्स कोडेक में बेस 64-एनकोडर एक बेहतर विकल्प होगा, उदाहरण के लिए।


एक छोटी सी बात लेकिन अगर आप hmac (कुंजी, संदेश) के बराबर की तलाश कर रहे हैं तो डिफ़ॉल्ट रूप से अजगर लाइब्रेरी MD5 एल्गोरिथ्म का उपयोग करेगा, इसलिए आपको जावा में HmacMD5 एल्गोरिथ्म का उपयोग करने की आवश्यकता है।

मैं इसका उल्लेख करता हूं क्योंकि मुझे यह सटीक समस्या थी और यह उत्तर मिला जो सहायक था, लेकिन मैंने उस हिस्से को याद किया जहां एक पाचन विधि hmac () में पारित हुई थी और इस तरह एक खरगोश छेद नीचे चला गया। उम्मीद है कि यह जवाब भविष्य में दूसरों को भी ऐसा करने से रोकेगा।

उदाहरण के लिए पायथन आरईपीएल

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

यह जावा विधि के बराबर है:

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 () के बराबर काम कर रहा हूं





cryptoapi