Mysql
 sql >> база данни >  >> RDS >> Mysql

BCrypt Проверете съхранената хеш парола

Особено когато става въпрос за криптиране, трябва да имате някаква обща представа за включените принципи и концепции. Хеширане на солена парола обяснява често срещани клопки и прави редица препоръки (една е BCrypt , така че може да сте на прав път).

Изглежда, че не четете съхранения хеш от DB, преди да потвърдите. Не показвате как се запазва, но това е важно, за да може да се провери.

 ' 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 блок. Това ги създава в началото и ги изхвърля в края на блока.
  • Това използва имейл за уникален идентификатор, защото има много Steves там. Това означава, че SQL ще върне най-много един запис.
  • След като заредите хеширания pw от DB, използвайте го за проверка на въведения опит за парола. Вашият код изглежда създава нов хеш (и всъщност не зарежда нищо от DB).

Произволната сол, първоначално генерирана при създаването на акаунта, става част от хеша (както и работния фактор, който сте използвали), както е показано тук:

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. MySQL за Visual Studio 2012/2013

  2. Как да оптимизирате допълнително тази MySQL таблица за една заявка

  3. MySql - Актуализирайте таблицата, като използвате оператор за избор от същата таблица

  4. Как мога да променя времето за изчакване на Mysql връзка по подразбиране при свързване чрез python?

  5. изберете опция за актуализиране на втората опция за избор въз основа на попълнените от mysql падащи менюта