मैं .net port of libsodium का उपयोग कर रहा हूं।एक बाइट सरणी को स्ट्रिंग में कनवर्ट करना और फिर फिर से अलग-अलग परिणाम
public static byte[] ArgonHashBinary(string password, string salt, long opsLimit, int memLimit, long outputLength = ARGON_SALTBYTES)
public static byte[] ArgonHashBinary(byte[] password, byte[] salt, long opsLimit, int memLimit, long outputLength = ARGON_SALTBYTES)
क्या मैं के साथ समस्या हो रही है दोनों एक ही हैश उत्पादन जब इनपुट मान समान हैं रूपों है: हैश पीढ़ी समारोह दो रूपों, एक कि बाइट सरणियों स्वीकार करता है और एक है कि तार को स्वीकार करता है।
var saltAsBytes = PasswordHash.ArgonGenerateSalt();
var saltAsString = Encoding.UTF8.GetString(saltAsBytes);
var tmp = Encoding.UTF8.GetBytes(saltAsString);
var hash1 = PasswordHash.ArgonHashBinary(password, saltAsString, 6, 134217728, 16);
var hash2 = PasswordHash.ArgonHashBinary(Encoding.UTF8.GetBytes(password), saltAsBytes, 6, 134217728, 16);
"पासवर्डशैश" के साथ कुछ भी। libsodium है और मेरा कोड नहीं है।
उपरोक्त कोड से जब मैं इसे एक स्ट्रिंग से परिवर्तित करता हूं और फिर बाइट सरणी को बाइट सरणी में वापस ले जाता हूं। बाइट सरणी सरणी हमेशा एक अलग लंबाई है। ArgonGenerateSalt()
16 की लंबाई के साथ एक बाइट सरणी उत्पन्न करता है। जब मैं इसे आम तौर पर ~ 30 (विभिन्न नमक के उत्पादन के कारण अलग-अलग) के ऊपर एक स्ट्रिंग से वापस परिवर्तित करता हूं।
मैं यूटीएफ 8 में क्यों परिवर्तित हो रहा हूं? क्योंकि thats क्या वे आंतरिक रूप से कर रहे हैं: https://github.com/adamcaudill/libsodium-net/blob/master/libsodium-net/PasswordHash.cs
public static byte[] ArgonHashBinary(string password, string salt, StrengthArgon limit = StrengthArgon.Interactive, long outputLength = ARGON_SALTBYTES)
{
return ArgonHashBinary(Encoding.UTF8.GetBytes(password), Encoding.UTF8.GetBytes(salt), limit, outputLength);
}
जब मैं एक UTF8 स्ट्रिंग हैशिंग समारोह असफल क्योंकि वे सुनिश्चित करें कि अपने 16 बाइट्स बनाने के लिए बाइट सरणी की लंबाई की जाँच कर रहे जाएगा नमक परिवर्तित। यदि मैं इसे एक ASCII स्ट्रिंग में परिवर्तित करता हूं तो यह काम करता है लेकिन एक अलग हैश (जो अपेक्षित है) उत्पन्न करता है।
इस कोड में हैशिंग टुकड़ा को स्पष्ट करने के लिए यह मुद्दा नहीं है। tmp
क्यों अलग है तो saltAsBytes
कुंजी है।
आप 'PasswordHash में कोड एकल कदम रखा है यह देखने के लिए कि चीजें अलग-अलग कहां जा रही हैं? –
@JimMischel कौन सा हिस्सा?उपरोक्त सबसे महत्वपूर्ण टुकड़ा तब होता है जब मैं नमक उत्पन्न करता हूं और फिर इसे एक स्ट्रिंग में घुमाता हूं और फिर एक बाइट सरणी में फिर से वापस ले जाता हूं। पाठ्यक्रम का अधिकांश कोड मेरा अपना है। लाइब्रेरी केवल एक चीज यादृच्छिक नमक का उत्पादन कर रही है। 'Tmp' चर के विषय में सबसे अधिक क्या है 'saltAsBytes' के समान नहीं है। तो मुझे नहीं लगता कि यह हैशिंग टुकड़े के साथ कुछ भी करने के लिए है। एक बार मुझे पता चला कि यह क्यों हो रहा है कि हैशिंग टुकड़ा शायद काम करेगा। – coding4fun
क्या आप सुनिश्चित हैं कि बाइट सरणी में केवल वैध यूटीएफ -8 कोड हैं? मुझे यकीन नहीं है कि GetBytes() कैसे काम करता है, जब सरणी में अमान्य कोड बिंदु होते हैं। –