2011-09-30 9 views
10

के SHA1-function से भिन्न परिणाम देता है मेरे पास उपयोगकर्ता नाम और पासवर्ड के साथ एक SQL तालिका है। पासवर्ड MessageDigest की पाचन() विधि का उपयोग करके एन्कोड किए गए हैं। अगर मैं पासवर्ड एन्कोड करता हूं - मान लें कि "abcdef12" - MessageDigest की digest() विधि के साथ और फिर इसे हेक्साडेसिमल मानों में परिवर्तित करें, तो स्ट्रिंग अलग है यदि मैं PHP की SHA1-विधि का उपयोग कर ऐसा करता हूं। मैं उम्मीद करता हूं कि ये मान बिल्कुल वही हों।जावा का संदेशडिगस्ट SHA1-एल्गोरिदम php

कोड कि पासवर्ड एन्कोड करने के लिए प्रयोग किया जाता है:

public static String convertStringToHex(String str) { 

    char[] chars = str.toCharArray(); 

    StringBuffer hex = new StringBuffer(); 
    for (int i = 0; i < chars.length; i++) { 
     hex.append(Integer.toHexString((int) chars[i])); 
    } 

    return hex.toString(); 
} 

पासवर्ड:: abcdef12

यहाँ

MessageDigest md = MessageDigest.getInstance("SHA-1"); 
byte[] passbyte; 
passbyte = "abcdef12".getBytes("UTF-8"); 
passbyte = md.digest(passbyte); 

हेक्साडेसिमल में स्ट्रिंग के रूपांतरण इस पद्धति का उपयोग किया जाता है बहुत सारे SHA1-हैश ऑनलाइन जनरेटर और PHP SHA1() - फ़ंक्शन: d253e3b द्वारा लौटाए गए पासवर्ड

d69ce1e7ce6074345fd5faa1a3c2e89ef यहाँ पासवर्ड के रूप में MessageDigest द्वारा इनकोडिंग है: d253e3bd69ce1e7ce674345fd5faa1a3c2e2030ef

मैं कुछ भूल रहा हूं?

इगोर।

संपादित करें: मुझे किसी को भी इसी तरह की समस्या मिली है: C# SHA-1 vs. PHP SHA-1...Different Results?। समाधान एन्कोडिंग को बदलना था .. लेकिन मैं सर्वर-साइड पर एन्कोडिंग नहीं बदल सकता क्योंकि SQL सर्वर में पासवर्ड मेरे एप्लिकेशन द्वारा नहीं बनाए गए हैं। मैं एक जावास्क्रिप्ट SHA1-class (अधिक सटीक: एक Google वेब टूलकिट-क्लास) का उपयोग कर क्लाइंट-साइड SHA1-एन्कोडिंग का उपयोग करता हूं। यह काम करता है और उम्मीद के रूप में स्ट्रिंग encodes, लेकिन जाहिरा तौर ASCII वर्ण का उपयोग कर ..

उत्तर

3

इसमें एन्कोडिंग के साथ कुछ लेना देना नहीं है। उत्पादन पूरी तरह से अलग होगा।

स्टार्टर्स के लिए, आपका फ़ंक्शन convertStringToHex() अग्रणी शून्य उत्पन्न नहीं करता है, यानी 07 केवल 7 बन जाता है।

बाकी (89 से 2030 में बदलना) उस समारोह के साथ कुछ करने की संभावना है। passbyte = md.digest(passbyte); के बाद passbyte के मान को देखने का प्रयास करें।

+0

धन्यवाद! आपके जवाब ने मेरी समस्या हल की। मैं बाइट-सरणी को हेक्साडेसिमल स्ट्रिंग में ठीक से परिवर्तित करने में विफल रहा था! मैंने @stivlo से विधि का उपयोग किया और यह बहुत अच्छा काम किया! मैं इस प्रतिक्रिया को सही के रूप में चिह्नित करने जा रहा हूं, हालांकि इस मामले में मैं चाहता हूं कि मैं दोनों प्रतिक्रियाओं को सही के रूप में चिह्नित कर सकूं! आप दोनों को धन्यवाद! – Igor

5

मैं एक ही मेरी जावा SHA-1 हैशिंग समारोह के साथ PHP के रूप में पचा है:

public static String computeSha1OfString(final String message) 
    throws UnsupportedOperationException, NullPointerException { 
     try { 
       return computeSha1OfByteArray(message.getBytes(("UTF-8"))); 
     } catch (UnsupportedEncodingException ex) { 
       throw new UnsupportedOperationException(ex); 
     } 
} 

private static String computeSha1OfByteArray(final byte[] message) 
    throws UnsupportedOperationException { 
     try { 
      MessageDigest md = MessageDigest.getInstance("SHA-1"); 
      md.update(message); 
      byte[] res = md.digest(); 
      return toHexString(res); 
     } catch (NoSuchAlgorithmException ex) { 
      throw new UnsupportedOperationException(ex); 
     } 
} 

मैं में शामिल किया है मेरी इकाई परीक्षण:

String sha1Hash = StringHelper.computeSha1OfString("abcdef12"); 
assertEquals("d253e3bd69ce1e7ce6074345fd5faa1a3c2e89ef", sha1Hash); 

वर्ग के लिए पूर्ण स्रोत कोड on github है।

+0

दरअसल - अपने कोड का उत्पादन सही SHA1 (या बल्कि: php के SHA1 के समान)। हालांकि, मैं एक ऐसा एप्लीकेशन लिख रहा हूं जिसे मौजूदा डेटाबेस में लॉगिन करना है। वह डेटाबेस स्वयं द्वारा नहीं बनाया गया है (और न ही पासवर्ड एन्क्रिप्शन है)। लेकिन ** यह मेरे उदाहरण ** में लिखे गए संदेशडिगेट का उपयोग करता है और इस प्रकार उस स्ट्रिंग पर बेस 64.decode चला रहा है, जो आपके सही परिणाम के बजाय एक अलग परिणाम (मेरे उदाहरण में निर्दिष्ट एक) देता है, जिसे मैं उस जावास्क्रिप्ट SHA1- कक्षा। क्या उनकी तुलना करने का कोई तरीका है? मुझे नहीं पता कि MessageDigest उस दूसरे परिणाम को कैसे लौट रहा था। – Igor

2

इस प्रयास करें - यह मेरे लिए काम कर रहा है:

MessageDigest md = MessageDigest.getInstance(algorithm); 
md.update(original.getBytes()); 
byte[] digest = md.digest(); 
StringBuffer sb = new StringBuffer(); 
for (byte b : digest) { 
    sb.append(Integer.toString((b & 0xff) + 0x100, 16).substring(1)); 
} 
return sb.toString(); 

सादर, Konki

2

या इस प्रयास करें:

MessageDigest md = MessageDigest.getInstance("SHA-1"); 
md.update(clearPassword.getBytes("UTF-8")); 
return new BigInteger(1 ,md.digest()).toString(16)); 

चीयर्स रॉय

संबंधित मुद्दे