Mysql
 sql >> डेटाबेस >  >> RDS >> Mysql

BCrypt संग्रहीत पासवर्ड हैश सत्यापित करें

विशेष रूप से जब एन्क्रिप्शन की बात आती है, तो आपको इसमें शामिल सिद्धांतों और अवधारणाओं का कुछ सामान्य विचार होना चाहिए। नमकीन पासवर्ड हैशिंग आम नुकसान की व्याख्या करता है और कई सिफारिशें करता है (एक है 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$" . के बाद कार्य कारक है।




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. सिंटैक्स त्रुटि या पहुँच उल्लंघन:1055 अभिव्यक्ति #17 समूह द्वारा

  2. आर और माईएसक्यूएल - dbWriteTable() का उपयोग करके इसे लिखने से पहले किसी तालिका में कोई पंक्ति मौजूद है या नहीं

  3. जेपीए ग्रहण दो विदेशी कुंजी @IdClass कार्यान्वयन त्रुटियां

  4. एक mysql तालिका में एक प्रकार का ऑटो वेतन वृद्धि कॉलम जोड़ना

  5. एक SSL कनेक्शन पर Django को एक MySQL डेटाबेस से कैसे कनेक्ट करें?