sql >> データベース >  >> RDS >> Mysql

BCrypt保存されたパスワードハッシュを確認する

    特に暗号化に関しては、関連する原則と概念についての一般的な考え方が必要です。 ソルトパスワードハッシュ 一般的な落とし穴を説明し、いくつかの推奨事項を作成します(1つは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
    

    メモ

    • DbConnectionDbCommand およびDbDataReader すべてDisposeを実装します つまり、解放する必要のあるリソースを十分に割り当てることができます。コードは、Usingでそれぞれを使用します ブロック。これにより、最初にそれらが作成され、ブロックの最後にそれらが破棄されます。
    • スティーブがたくさんいるので、これは一意の識別子に電子メールを使用します。これは、SQLが最大で1つのレコードを返すことを意味します。
    • DBからハッシュされたpwをロードした後、 を使用します 入力されたパスワードの試行を確認します。あなたのコードは新しいハッシュを作成しているようです(そして実際には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. CLOBとVARCHAR2、および他の選択肢はありますか?

    2. SQLiteOpenHelperを使用してAndroidでsqliteデータベースをアタッチする

    3. java.sql.TimestampでJoda-Timeを使用する方法

    4. codeigniterの複数のwhere_in条件の配列