Mysql
 sql >> Baza danych >  >> RDS >> Mysql

BCrypt Zweryfikuj zapisany hash hasła

Zwłaszcza jeśli chodzi o szyfrowanie, powinieneś mieć ogólne pojęcie o związanych z nim zasadach i koncepcjach. Hashing solonego hasła wyjaśnia typowe pułapki i przedstawia szereg zaleceń (jedną z nich jest BCrypt , więc możesz być na dobrej drodze).

Wygląda na to, że nie odczytujesz zapisanego skrótu z bazy danych przed weryfikacją. Nie pokazujesz, jak jest zapisany, ale jest to ważne, aby można go było zweryfikować.

 ' cuts down on dot operators
 Imports BCryptor = BCrypt.Net.BCrypt

Utwórz nowe logowanie

' 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

Zweryfikuj próbę

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

Notatki

  • DbConnection , DbCommand i DbDataReader wszystkie implementują Dispose co oznacza, że ​​mogą bardzo dobrze alokować zasoby, które muszą zostać uwolnione. Kod używa każdego z nich w Using blok. To tworzy je na początku i usuwa na końcu Bloku.
  • Unikatowy identyfikator jest używany w adresie e-mail, ponieważ Steve'ów jest wielu. Oznacza to, że SQL zwróci najwyżej jeden rekord.
  • Po wczytaniu zahaszowanego pw z bazy danych użyj go aby zweryfikować wprowadzoną próbę hasła. Twój kod wydaje się tworzyć nowy skrót (i faktycznie nie ładuje niczego z bazy danych).

Losowa sól generowana pierwotnie podczas tworzenia konta staje się częścią skrótu (jak również użytym czynnikiem pracy), jak pokazano tutaj:

Dim pw = "My!Weak#Pa$$word"
Dim salt = BCryptor.GenerateSalt(12)
Dim hash = BCryptor.HashPassword(pw, salt)

Console.WriteLine(salt)
Console.WriteLine(hash)

Wyjście:

12 po "$2a$" to czynnik pracy.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Jak umieścić klauzulę „if” w ciągu SQL?

  2. Zapytanie SELECT w klauzuli WHERE zapytania UPDATE

  3. Dlaczego w mojej kolumnie danych MySQL zapisywane jest tylko 64 KB danych?

  4. Sparametryzowana nazwa tabeli

  5. Konwertuj MySQL na XML przez PHP