2011-05-30 18 views
6

संपादित करें: ठीक है तो मैं कुछ हद तक एक जवाब यहाँ मिल गया है BCrypt says long, similar passwords are equivalent - problem with me, the gem, or the field of cryptography?jBCrypt गंभीर मुद्दा (सच लौटने जब यह नहीं करना चाहिए?)

नए सवाल हालांकि, कैसे किसी को hashing अगर आपके पास के लिए bCrypt का उपयोग कर सिफारिश कर सकते हैं किसी ऐसे दुनिया में उपयोगकर्ता की पासवर्ड लंबाई को सीमित करने के लिए जहां हम उपयोगकर्ताओं को तेजी से जटिल पासवर्ड चुनने के लिए शिक्षित करने की कोशिश कर रहे हैं, यहां तक ​​कि पासफ्रेज भी कह रहे हैं कि आपका पासवर्ड एन अक्षरों से छोटा होना चाहिए, शुक्रवार के स्क्रीनशॉट में thedailywtf.com में समाप्त होने का तरीका लगता है :)

नीचे मूल प्रश्न:

मैं एक पुराना लॉगिन दोबारा कर रहा हूं एक आवेदन के लिए पृष्ठ और जावा कार्यान्वयन jBCrypt (http://www.mindrot.org/projects/jBCrypt/) का उपयोग करके एक घुड़सवार bcrypt देने का फैसला किया और एक प्रमुख शो स्टॉपर में भाग गया।

समस्या चेकप विधि के साथ है जो हमेशा एक बहुत लंबे बीज का उपयोग करते समय सच होने लगती है। मैं {InternalSalt} {username} {password} के साथ उपयोगकर्ता का पासवर्ड नमक करने जा रहा था और फिर हैश कि bCrypt के साथ।

तो मेरे पास निम्न कोड है (इसे चेकप को अलग करने के लिए जितना संभव हो उतना नीचे छीन लिया गया है)।

public class Test { 
public static void main(String[] args) { 
    String plaintext = "jw~ct/f61y1m7q458GiLVQpiqDK|8kG=d368Id:[email protected]$^_80I{qrn1HM6423{FtestAccountO1nu3jKN"; 

    String pw_hash = BCrypt.hashpw(plaintext, BCrypt.gensalt()); 

    if (BCrypt.checkpw("jw~ct/f61y1m7q458GiLVQpiqDK|8kG=d368Id:[email protected]$^_80I{qrn1HM6423{FtestAccountO1nu3jKN", pw_hash)) 
     System.out.println("It matches"); 
    else 
     System.out.println("It does not match"); 

} 

}

हो जाएगा ताकि, के रूप में यह होना चाहिए, प्रिंट "यह मेल खाता है"। डी @ $^_ 80i: 8 किलो = d368Id |

समस्या मैं कर रहा हूँ कहना है कि आप कहते हैं जोड़ने aaa पासवर्ड के लिए आप कर यह

BCrypt.checkpw ("जेडब्ल्यू ~ सीटी/f61y1m7q458GiLVQpiqDK checkpw के पास है {qrn1HM6423 {FtestAccountO1nu3jKNaaa ", pw_hash)

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

क्या मुझे कुछ प्रमुख याद आया? मुझे पता है कि इन फोरम पर जेबीक्रिप्ट का उपयोग करने वाला मुझे अकेला नहीं होना चाहिए क्योंकि मैंने कुछ शोध करते समय बीसीआरपीटी को कई पदों में अनुशंसित देखा है।

संपादित करें: विंडोज 7 64 बिट्स - जावा (टीएम) एसई रनटाइम वातावरण (निर्माण 1.6.0_24-B07)

उत्तर

5

ठीक है, तो शब्दों सवाल मुझे दिया पर्याप्त वास्तव में यह पता लगाने की मैं क्या देख रहा था (हुर्रे rubber ducking के लिए)। क्रिप्टोग्राफी का क्षेत्र अब सुरक्षित है!

बीक्रिप्ट कार्यान्वयन XOR P_orig का उपयोग करते हुए जो 18 4 बाइट्स पूर्णांक तक अंत तक पहुंच जाता है, जो आपके एन्क्रिप्शन "कुंजी" को 72 बाइट्स तक सीमित करता है। 72 बाइट्स के बाद Eveyrything अनदेखा किया जाता है (एक चेतावनी अच्छा होता)।

स्वीकार्य समझौता क्या होता है यह उपयोगकर्ता के पासवर्ड को 72 वर्णों या उससे कम तक सीमित नहीं करना है, बल्कि इसे चुपचाप पास करने दें। इसके पीछे विचार यह है कि एक 72 वर्ण बीक्रिप्टेड पासवर्ड वैसे भी तेजी से हैशिंग विकल्प से बेहतर है।

स्रोत: BCrypt says long, similar passwords are equivalent - problem with me, the gem, or the field of cryptography?

2

वास्तव में अपने खुद के जवाब महान है और कष्टप्रद मुद्दा लगता है मुझे मदद मिली;) जो hashing से पहले एप्लिकेशन की गुप्त सादे करने के लिए किसी तरह का कहते हैं लोगों के लिए कुछ टिप (यहां तक ​​कि अगर वहाँ वे पासवर्ड की लंबाई को सीमित करते हैं): अंत पर ऐप गुप्त शामिल करें, खासकर यदि ऐप का रहस्य 72 वर्ण लंबा है - अन्यथा प्रत्येक हिट true वापस आ जाएगी!

तो बजाय:

String hashed = BCrypt.hashpw(APP_SECRET + plain, BCrypt.gensalt())

उपयोग:

String hashed = BCrypt.hashpw(plain + APP_SECRET, BCrypt.gensalt())

यहां तक ​​कि अगर Bcrypt की कांट-छांट checkpw परिणाम हो जाएगा वैध हो जाएगा!

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