sql >> Databáze >  >> RDS >> Mysql

BCrypt Ověřte uložený hash hesla

Zejména pokud jde o šifrování, měli byste mít nějakou obecnou představu o principech a pojmech. Salted Password Hashing vysvětluje běžná úskalí a uvádí řadu doporučení (jedno je BCrypt , takže možná jste na správné cestě).

Zdá se, že před ověřením nečtete uložený hash z DB. Neukazujete, jak se to ukládá, ale to je důležité pro ověření.

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

Vytvořit nové přihlášení

' 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

Ověřte pokus

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

Poznámky

  • DbConnection , DbCommand a DbDataReader všechny implementují Dispose což znamená, že mohou velmi dobře alokovat zdroje, které je třeba uvolnit. Kód používá každý z nich v Using blok. To je vytvoří na začátku a zlikviduje je na konci bloku.
  • Toto používá e-mail pro jedinečný identifikátor, protože je tam hodně Steveů. To znamená, že SQL vrátí maximálně jeden záznam.
  • Po načtení hashovaného pw z DB použijte to pro ověření zadaného pokusu o heslo. Zdá se, že váš kód vytváří nový hash (a ve skutečnosti nenačítá nic z DB).

Náhodná sůl původně vygenerovaná při vytvoření účtu se stává součástí hash (stejně jako faktor práce, který jste použili), jak je znázorněno zde:

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

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

Výstup:

12 po "$2a$" je pracovní faktor.




  1. Oracle SQL porovnává záznamy v tabulce

  2. Chyba:Duplicitní záznam „0“ pro klíč „PRIMARY“

  3. sql triggery Mám chybu při ukládání názvu sloupce do proměnné a používám jej pro OLD.myvar v sql triggerech

  4. Klauzule UPDATE-FROM v jOOQ vyvolá expeptaci pro pole CTE