विशेष रूप से जब एन्क्रिप्शन की बात आती है, तो आपको इसमें शामिल सिद्धांतों और अवधारणाओं का कुछ सामान्य विचार होना चाहिए। नमकीन पासवर्ड हैशिंग
आम नुकसान की व्याख्या करता है और कई सिफारिशें करता है (एक है BCrypt
, तो आप सही रास्ते पर हो सकते हैं)।
ऐसा लगता है कि आप सत्यापित करने से पहले डीबी से संग्रहीत हैश नहीं पढ़ रहे हैं। आप यह नहीं दिखाते कि इसे कैसे सहेजा जाता है, लेकिन इसे सत्यापित करने के लिए यह महत्वपूर्ण है।
' cuts down on dot operators
Imports BCryptor = BCrypt.Net.BCrypt
नया लॉगऑन बनाएं
' new user save
Dim sql = "INSERT INTO userlogin (email, username, pwhash) VALUES (@email, @n, @pw)"
' prep:
Dim salt = BCryptor.GenerateSalt(12) ' == 2^12
Dim hash = BCryptor.HashPassword(tbPass)
' to do: Try/Catch for an email that already exists
Using dbCon As New MySqlConnection(MySQLConnStr),
cmd As New MySqlCommand(sql, dbCon)
cmd.Parameters.Add("@email", MySqlDbType.Text).Value = tbEmail
cmd.Parameters.Add("@n", MySqlDbType.Text).Value = tbUserName
cmd.Parameters.Add("@pw", MySqlDbType.Text).Value = hash
dbCon.Open()
cmd.ExecuteNonQuery()
End Using
एक प्रयास सत्यापित करें
Dim bRet As Boolean = False
' login user
Dim sql = "SELECT pwhash FROM userlogin WHERE email = @email"
Using dbCon As New MySqlConnection(MySQLConnStr),
cmd As New MySqlCommand(sql, dbCon)
' data for the where clause
cmd.Parameters.Add("@email", MySqlDbType.Text).Value = tbEmail
dbCon.Open()
Using rdr = cmd.ExecuteReader()
' read from the reader to load data
If rdr.Read() Then
' get the saved hash
Dim savedHash = rdr.GetString(0)
bRet = BCryptor.Verify(tbPass, savedHash)
Else
bRet = False
End If
End Using
' return whether the hash verified
Return ret
End Using
नोट
DbConnection
,DbCommand
औरDbDataReader
सभी लागू करेंDispose
जिसका अर्थ है कि वे बहुत अच्छी तरह से संसाधनों का आवंटन कर सकते हैं जिन्हें जारी करने की आवश्यकता है। कोड उनमें से प्रत्येक का उपयोगUsing
. में करता है खंड मैथा। यह उन्हें शुरुआत में बनाता है और ब्लॉक के अंत में उनका निपटान करता है।- यह विशिष्ट पहचानकर्ता के लिए एक ईमेल का उपयोग करता है क्योंकि वहाँ बहुत सारे स्टीव हैं। इसका अर्थ है कि SQL अधिक से अधिक एक रिकॉर्ड लौटाएगा।
- DB से हैशेड pw लोड करने के बाद, इसका उपयोग करें इसे दर्ज किए गए पासवर्ड प्रयास को सत्यापित करने के लिए। ऐसा लगता है कि आपका कोड एक नया हैश बना रहा है (और वास्तव में डीबी से कुछ भी लोड नहीं करता है)।
खाता बनाते समय मूल रूप से उत्पन्न यादृच्छिक नमक हैश (साथ ही आपके द्वारा उपयोग किए जाने वाले कार्य कारक) का हिस्सा बन जाता है जैसा कि यहां दिखाया गया है:
Dim pw = "My!Weak#Pa$$word"
Dim salt = BCryptor.GenerateSalt(12)
Dim hash = BCryptor.HashPassword(pw, salt)
Console.WriteLine(salt)
Console.WriteLine(hash)
आउटपुट:
12
"$2a$"
. के बाद कार्य कारक है।