दिलचस्प पोस्ट
अजगर में एक्सटेंशन के बिना फ़ाइलों के प्रकार की जांच कैसे करें? @ कंट्रोलर वर्ग में वैल्यू एनोटेशन वसंत @ गुणों की वैल्यू के मूल्यांकन के लिए नहीं है कोई MySQL में DATETIME फ़ील्ड के दिनांक हिस्से पर एक इंडेक्स कैसे बना सकता है संरचना पैडिंग और पैकिंग त्रुटि "एडीबी से कनेक्शन डाउन है, और एक गंभीर त्रुटि हुई है।" रंग 1 और रंग 2 से लेकर एन रंग की ढाल UIWebView "लंबवत" से खड़ी हो? START_STICKY और START_NOT_STICKY जावा और SQLite MVC के लिए कस्टम सत्यापन विशेषता कैसे बनाएं एनिमेटेड जीआईएफ़ प्रदर्शित करें क्या मैं Xcode के साथ सी ++ 11 का उपयोग कर सकता हूं? MySQL स्थानिक डेटा का उपयोग करते हुए Google Maps पर निकटतम स्थान प्राप्त करें क्या जावास्क्रिप्ट संपत्ति नामों में डैश की अनुमति है? पायथन फ्लोट – स्ट्रॉफ फ्लोट विचित्रता

ASP.NET पहचान डिफ़ॉल्ट पासवर्ड हैशर, यह कैसे काम करता है और यह सुरक्षित है?

मैं पासवर्ड हैशर को मौसम में सोच रहा हूं जो कि यूजर मैनेजर में लागू होता है जो कि एमवीसी 5 और एएसपी.NET पहचान फ़्रेमवर्क के साथ आता है, वह काफी सुरक्षित है? और यदि हां, तो क्या आप मुझे समझा सकते हैं कि यह कैसे काम करता है?

IPasswordHasher इंटरफ़ेस इस तरह दिखता है:

public interface IPasswordHasher { string HashPassword(string password); PasswordVerificationResult VerifyHashedPassword(string hashedPassword, string providedPassword); } 

जैसा कि आप देख सकते हैं, यह नमक नहीं लेता है, लेकिन इस धागे में इसका उल्लेख किया गया है: " asp.net पहचान पासवर्ड हैशिंग " कि यह दृश्यों के पीछे नमक को वास्तव में करता है। तो मैं सोच रहा हूं कि यह कैसे करता है? और यह नमक कहां से आता है?

मेरी चिंता यह है कि नमक स्थिर है, यह काफी असुरक्षित है।

वेब के समाधान से एकत्रित समाधान "ASP.NET पहचान डिफ़ॉल्ट पासवर्ड हैशर, यह कैसे काम करता है और यह सुरक्षित है?"

यहां बताया गया है कि डिफ़ॉल्ट कार्यान्वयन कैसे काम करता है। यह हैश का उत्पादन करने के लिए यादृच्छिक नमक के साथ एक कुंजी व्युत्पन्न फ़ंक्शन का उपयोग करता है। नमक को केडीएफ के उत्पादन के हिस्से के रूप में शामिल किया गया है। इस प्रकार, हर बार जब आप "हैश" एक ही पासवर्ड को आप अलग हैश प्राप्त करेंगे। हैश को सत्यापित करने के लिए उत्पादन वापस नमक और बाकी हिस्सों में विभाजित किया जाता है, और निर्दिष्ट नमक के साथ पासवर्ड पर फिर से KDF चलाया जाता है। यदि परिणाम प्रारंभिक आउटपुट के बाकी हिस्सों से मेल खाता है तो हैश सत्यापित है।

hashing:

 public static string HashPassword(string password) { byte[] salt; byte[] buffer2; if (password == null) { throw new ArgumentNullException("password"); } using (Rfc2898DeriveBytes bytes = new Rfc2898DeriveBytes(password, 0x10, 0x3e8)) { salt = bytes.Salt; buffer2 = bytes.GetBytes(0x20); } byte[] dst = new byte[0x31]; Buffer.BlockCopy(salt, 0, dst, 1, 0x10); Buffer.BlockCopy(buffer2, 0, dst, 0x11, 0x20); return Convert.ToBase64String(dst); } 

सत्यापित किया जा रहा:

 public static bool VerifyHashedPassword(string hashedPassword, string password) { byte[] buffer4; if (hashedPassword == null) { return false; } if (password == null) { throw new ArgumentNullException("password"); } byte[] src = Convert.FromBase64String(hashedPassword); if ((src.Length != 0x31) || (src[0] != 0)) { return false; } byte[] dst = new byte[0x10]; Buffer.BlockCopy(src, 1, dst, 0, 0x10); byte[] buffer3 = new byte[0x20]; Buffer.BlockCopy(src, 0x11, buffer3, 0, 0x20); using (Rfc2898DeriveBytes bytes = new Rfc2898DeriveBytes(password, dst, 0x3e8)) { buffer4 = bytes.GetBytes(0x20); } return ByteArraysEqual(buffer3, buffer4); } 

क्योंकि ये दिन ASP.NET ओपन सोर्स है, आप इसे AspNet.Identity 3.0 के लिए GitHub पर या AspNet.Identity 2.0 के लिए Codeplex पर पा सकते हैं।

टिप्पणियों से:

 /* ======================= * HASHED PASSWORD FORMATS * ======================= * * Version 2: * PBKDF2 with HMAC-SHA1, 128-bit salt, 256-bit subkey, 1000 iterations. * (See also: SDL crypto guidelines v5.1, Part III) * Format: { 0x00, salt, subkey } * * Version 3: * PBKDF2 with HMAC-SHA256, 128-bit salt, 256-bit subkey, 10000 iterations. * Format: { 0x01, prf (UInt32), iter count (UInt32), salt length (UInt32), salt, subkey } * (All UInt32s are stored big-endian.) */ 

मेरे जैसे उन लोगों के लिए जो इस के लिए नए ब्रांड हैं, यहां कोड के साथ कोड है और बाइट [] की तुलना करने के लिए एक वास्तविक तरीका है। मुझे यह कोड स्टैकेवरफ्लो से मिला, लेकिन परिभाषित कंस्ट्रक्शन इसलिए मूल्य परिवर्तित हो सकते हैं और भी

 // 24 = 192 bits private const int SaltByteSize = 24; private const int HashByteSize = 24; private const int HasingIterationsCount = 10101; public static string HashPassword(string password) { // http://stackoverflow.com/questions/19957176/asp-net-identity-password-hashing byte[] salt; byte[] buffer2; if (password == null) { throw new ArgumentNullException("password"); } using (Rfc2898DeriveBytes bytes = new Rfc2898DeriveBytes(password, SaltByteSize, HasingIterationsCount)) { salt = bytes.Salt; buffer2 = bytes.GetBytes(HashByteSize); } byte[] dst = new byte[(SaltByteSize + HashByteSize) + 1]; Buffer.BlockCopy(salt, 0, dst, 1, SaltByteSize); Buffer.BlockCopy(buffer2, 0, dst, SaltByteSize + 1, HashByteSize); return Convert.ToBase64String(dst); } public static bool VerifyHashedPassword(string hashedPassword, string password) { byte[] _passwordHashBytes; int _arrayLen = (SaltByteSize + HashByteSize) + 1; if (hashedPassword == null) { return false; } if (password == null) { throw new ArgumentNullException("password"); } byte[] src = Convert.FromBase64String(hashedPassword); if ((src.Length != _arrayLen) || (src[0] != 0)) { return false; } byte[] _currentSaltBytes = new byte[SaltByteSize]; Buffer.BlockCopy(src, 1, _currentSaltBytes, 0, SaltByteSize); byte[] _currentHashBytes = new byte[HashByteSize]; Buffer.BlockCopy(src, SaltByteSize + 1, _currentHashBytes, 0, HashByteSize); using (Rfc2898DeriveBytes bytes = new Rfc2898DeriveBytes(password, _currentSaltBytes, HasingIterationsCount)) { _passwordHashBytes = bytes.GetBytes(SaltByteSize); } return AreHashesEqual(_currentHashBytes, _passwordHashBytes); } private static bool AreHashesEqual(byte[] firstHash, byte[] secondHash) { int _minHashLength = firstHash.Length <= secondHash.Length ? firstHash.Length : secondHash.Length; var xor = firstHash.Length ^ secondHash.Length; for (int i = 0; i < _minHashLength; i++) xor |= firstHash[i] ^ secondHash[i]; return 0 == xor; } 

अपने कस्टम अनुप्रयोग में उपयोगकर्ता प्रबंधक, आप पासवर्डहेशर प्रॉपर्टी को उस वर्ग का नाम सेट करते हैं जिसमें उपरोक्त कोड होता है।

मैं स्वीकार किए गए उत्तर को समझता हूं, और इसे ऊपर उठाया है, परन्तु सोचा कि मैं अपने laymen का जवाब यहाँ डंप कर दूंगा …

एक हैश बनाना

  1. नमक को बेतरतीब ढंग से फ़ंक्शन Rfc2898DeriveBytes का उपयोग करके उत्पन्न किया जाता है जो एक हैश और एक नमक उत्पन्न करता है। आरएफसी 2898 डरिवबाइट्स के लिए इनपुट पासवर्ड हैं, नमक का आकार उत्पन्न करने के लिए और हैशिंग पुनरावृत्तियों की संख्या। https://msdn.microsoft.com/en-us/library/h83s4e12(v=vs.110).aspx
  2. नमक और हैश तो एक साथ मिलाया जाता है (पहले नमक के बाद नमक) और एक स्ट्रिंग के रूप में एन्कोडेड (ताकि नमक को हैश में एन्कोड किया गया है)। यह एन्कोडेड हैश (जिसमें नमक और हैश है) को तब उपयोगकर्ता के विरुद्ध डेटाबेस में (आमतौर पर) संग्रहीत किया जाता है।

एक हैश के खिलाफ एक पासवर्ड की जांच

एक पासवर्ड जांचने के लिए कि उपयोगकर्ता इनपुट

  1. संग्रहीत हैशेड पासवर्ड से नमक निकाला जाता है
  2. नमक का उपयोग उपयोगकर्ता इनपुट पासवर्ड को आरएफसी 2898 डरिवबाइट्स के अधिभार के द्वारा उपयोग करने के लिए किया जाता है, जो कि एक को पैदा करने के बजाय नमक लेता है। https://msdn.microsoft.com/en-us/library/yx129kfs(v=vs.110).aspx
  3. संग्रहित हैश और टेस्ट हैश तब तुलना की जाती हैं।

हैश

कवर के तहत हैश SHA1 हैश फ़ंक्शन ( https://en.wikipedia.org/wiki/SHA-1 ) का उपयोग करके उत्पन्न होता है। इस फ़ंक्शन को 1000 बार बुलाया जाता है (डिफ़ॉल्ट पहचान कार्यान्वयन में)

यह सुरक्षित क्यों है

  • यादृच्छिक लवणों का अर्थ है कि कोई हमलावर पहले से जेनरेट किए गए टेबल हैशों का उपयोग करने के लिए और पासवर्ड को तोड़ने के लिए उपयोग नहीं कर सकता। उन्हें प्रत्येक नमक के लिए एक हैश तालिका तैयार करने की आवश्यकता होगी। (यहाँ मान लें कि हैकर ने आपके नमक को भी समझौता किया है)
  • अगर 2 पासवर्ड समान होते हैं तो उनके पास अलग हैश होंगे। (जिसका अर्थ है कि हमलावर 'सामान्य' पासवर्ड का अनुमान नहीं लगा सकते हैं)
  • SHA1 1000 बार कहने का मतलब यह है कि हमलावर को भी ऐसा करने की आवश्यकता है। यह विचार यह है कि जब तक उनके पास सुपर कंप्यूटर पर समय नहीं होता है, तब तक उनके पास पर्याप्त शक्ति नहीं होती है, जो कि जानवरों के लिए हैश से पासवर्ड है। यह एक नमक के लिए एक हैश तालिका उत्पन्न करने के लिए समय को बड़े पैमाने पर धीमा कर देगा।