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