सुरक्षा के बुनियादी उपाय के साथ पासवर्ड संग्रहीत करने की प्रक्रिया काफी सरल है:
- नमक से पासवर्ड हैश करें
- हर उपयोगकर्ता/पासवर्ड के लिए अलग-अलग नमक का इस्तेमाल करें
- नमक को हैशेड पासवर्ड के साथ DB में स्टोर करें
- जब वे लॉग इन करने का प्रयास करते हैं, तो उसी विधि से प्रयास किए गए PW को चलाएं; परिणाम की तुलना करें।
यदि उन्होंने सही पासवर्ड डाला है, तो हैश किए गए PW का मिलान हो जाएगा। हैशिंग उपयोगकर्ताओं को हमलों से और साथ ही चौकीदार को members
के साथ स्क्रीन पर चलने से बचाता है प्रदर्शन पर तालिका।
नमक बनाना और PW को हैश करना
' salt size is 32 (0-31
Private Const SaltSize As Integer = 31
...
Dim dbPW As String = TextBox1.Text
Dim dbSalt = CreateNewSalt(SaltSize)
' eg: "dsEGWpJpwfAOvdRZyUo9rA=="
Dim SaltedPWHash As String = GetSaltedHash(dbPW, dbSalt)
' examples:
' using SHA256: bbKN8wYYgoZmNaG3IsQ2DPS2ZPIOnenl6i5NwUmrGmo=
' using SHA512:
' 0vqZWBIbOlyzL25l9iWk51CxxJTiEM6QUZEH1ph+/aNp+lk4Yf8NYv8RLhYtbqCNpOqO3y8BmM+0YWtbAhE+RA=="
उपयोगकर्ता के रिकॉर्ड के हिस्से के रूप में पीडब्लू हैश और नमक को स्टोर करें। नमक गुप्त नहीं है, लेकिन जब/यदि उपयोगकर्ता अपना पासवर्ड बदलता है तो इसे बदल दें।
लॉगिन प्रयास की तुलना करना
' check if PW entered equals DB
Dim pwTry = TextBox2.Text
' hash the login attempt using the salt stored in the DB
Dim pwLogin = GetSaltedHash(pwTry, dbSalt)
' compare the hash of what they entered to whats in the DB:
If String.Compare(SaltedPWHash, pwLogin, False) = 0 Then
' okay!
Console.Beep()
End If
यदि उपयोगकर्ता समान PW में प्रवेश करता है, तो उसका परिणाम समान हैश होना चाहिए, यह उतना ही सरल है। हैशिंग कोड इतना जटिल नहीं है:
हैश तरीके
Private Function GetSaltedHash(pw As String, salt As String) As String
Dim tmp As String = pw & salt
' or SHA512Managed
Using hash As HashAlgorithm = New SHA256Managed()
' convert pw+salt to bytes:
Dim saltyPW = Encoding.UTF8.GetBytes(tmp)
' hash the pw+salt bytes:
Dim hBytes = hash.ComputeHash(saltyPW)
' return a B64 string so it can be saved as text
Return Convert.ToBase64String(hBytes)
End Using
End Function
Private Function CreateNewSalt(size As Integer) As String
' use the crypto random number generator to create
' a new random salt
Using rng As New RNGCryptoServiceProvider
' dont allow very small salt
Dim data(If(size < 7, 7, size)) As Byte
' fill the array
rng.GetBytes(data)
' convert to B64 for saving as text
Return Convert.ToBase64String(data)
End Using
End Function
- एक GUID (
System.Guid.NewGuid.ToString
जैसी किसी चीज़ का उपयोग करना आकर्षक है ) नमक के रूप में, लेकिन क्रिप्टोग्राफ़िक यादृच्छिक संख्या जनरेटर का उपयोग करना इतना कठिन नहीं है। - हैश किए गए पासवर्ड की तरह, एन्कोडिंग के कारण रिटर्न स्ट्रिंग लंबी होती है।
- हर बार उपयोगकर्ता द्वारा अपना पासवर्ड बदलने पर एक नया नमक बनाएं। वैश्विक नमक का प्रयोग न करें, यह उद्देश्य को हरा देता है।
- आप पीडब्लू को कई बार हैश भी कर सकते हैं। कुंजी का एक हिस्सा यह है कि हमला होने पर सभी विभिन्न संयोजनों को आजमाने में लंबा समय लगता है।
- फ़ंक्शन
Shared
के लिए आदर्श उम्मीदवार हैं /static
कक्षा के सदस्य।
यह भी ध्यान दें, केनेथ द्वारा लिंक किया गया लेख पढ़ने लायक है।
ध्यान दें कि लेख
उल्लेख The salt should be stored in the user account table alongside the hash
इसका मतलब यह नहीं है कि आपके पास Salt
होना चाहिए डीबी में कॉलम। आप लिंक किए गए लेख में निम्न कार्य होते हुए देख सकते हैं:
Dim dbPW As String = TextBox1.Text
Dim dbSalt = CreateNewSalt(SaltSize)
' get the salted PW hash
Dim SaltedPWHash As String = GetSaltedHash(dbPW, dbSalt)
' store salt with the hash:
SaltedPWHash = String.Format("{0}:{1}", dbSalt, dbPW)
' salt + ":" + hashed PW now ready to store in the db
नमक को हैशेड पासवर्ड से विभाजित करने के लिए:
Dim SaltAndPWHash = rdr.Item("PWHash").ToString()
Dim split = SaltAndPWHash.Split(":"c) ' split on ":"
Dim Salt = split(0) ' element(0) == salt
Dim StoredPWHash = split(1) ' element(1) == hashed PW
आपको दोनों भागों की आवश्यकता है:PW में प्रयास किए गए लॉग को हैश करने के बाद, इसकी तुलना split(1)
. से करें ।