2011-06-10 12 views
47

मैं HMAC-SHA1 का उपयोग कर कुछ मान hashing रहा हूँ, जावा में निम्नलिखित कोड का उपयोग कर:एचएमएसी-एसएचए 1: जावा में इसे ठीक से कैसे करें?

public static String hmacSha1(String value, String key) { 
    try { 
     // Get an hmac_sha1 key from the raw key bytes 
     byte[] keyBytes = key.getBytes();   
     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()); 

     // 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); 
    } 
} 

Hex() अंतर्गत आता है org.apache.commons.codec

लिए PHP में एक समान कार्य hash_hmac(algorithm, data, key) कि मैं मूल्यों लौटे तुलना करने के लिए उपयोग करते हैं वहाँ मेरे जावा कार्यान्वयन द्वारा।

तो पहली कोशिश है:

hash_hmac("sha1", "helloworld", "mykey") // PHP 

कि रिटर्न: 74ae5a4a3d9996d5918defc2c3d475471bbf59ac

मेरे जावा फ़ंक्शन 74ae5a4a3d9996d5918defc2c3d475471bbf59ac रूप में अच्छी तरह।

ठीक है, ऐसा लगता है।

hash_hmac("sha1", "helloworld", "PRIE7$oG2uS-Yf17kEnUEpi5hvW/#AFo") // PHP 

कि रिटर्न: e98bcc5c5be6f11dc582ae55f520d1ec4ae29f7a

जबकि इस बार मेरी जावा impl रिटर्न: तो फिर मैं एक अधिक जटिल कुंजी का उपयोग करने की कोशिश c19fccf57c613f1868dd22d586f9571cf6412cd0

हैश मेरी PHP कोड द्वारा लौटाए के बराबर नहीं है मेरे जावा फ़ंक्शन द्वारा मूल्य लौटाया गया, और मुझे पता नहीं चला कि क्यों।

कोई सुझाव?

+5

का उपयोग कर प्रवेश करने का प्रयास PHP में चर के रूप में $ chars की व्याख्या नहीं करेगा? –

+0

आपको हेक्स चरण की आवश्यकता क्यों है? –

उत्तर

51

अपने PHP पक्ष पर, कुंजी के चारों ओर सिंगल-कोट्स का उपयोग करें ताकि $ वर्ण को एक चर संदर्भ के रूप में नहीं माना जाता है। जैसे कि,

hash_hmac("sha1", "helloworld", 'PRIE7$oG2uS-Yf17kEnUEpi5hvW/#AFo') 

अन्यथा, कुंजी क्या तुम सच में मिल PRIE7-Yf17kEnUEpi5hvW/#AFo (चर $oG2uS संभालने परिभाषित नहीं है) है।

+5

भयानक बगफाइंडर! –

7

डबल कोट्स ("") में कोई भी $ प्रतीक PHP में एक चर के रूप में माना जाता है। जैसा कि पिछले टिप्पणीकार से कहा आप या तो एकल उद्धरण का उपयोग करके त्रुटि से बचने कर सकते हैं या आप के रूप में डॉलर साइन बच सकते हैं

नीचे
hash_hmac("sha1", "helloworld", "PRIE7\$oG2uS-Yf17kEnUEpi5hvW/#AFo") 

सूचना $ अब है \ $

0

में जावा, और Maven का उपयोग कर:

pom.xml में नीचे निर्भरता जोड़ें:

<!-- https://mvnrepository.com/artifact/commons-codec/commons-codec --> 
    <dependency> 
     <groupId>commons-codec</groupId> 
     <artifactId>commons-codec</artifactId> 
     <version>1.4</version> 
    </dependency> 

और फिर इसे इस

HmacUtils.hmacSha1Hex(key, string_to_sign); 
संबंधित मुद्दे