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

Czy przechowywanie nazw użytkowników i haseł w bazie danych jest bezpieczne?

Proces przechowywania haseł z podstawowymi środkami bezpieczeństwa jest dość prosty:

  • Hastuj hasła solą
  • Użyj innej soli dla każdego użytkownika/hasła
  • Przechowuj sól z haszowanym hasłem w bazie danych
  • Kiedy próbują się zalogować, uruchom próbowany PW tą samą metodą; porównaj wynik.

Jeśli wprowadzili poprawne hasło, zaszyfrowane PW będą pasować. Hashing chroni użytkowników przed atakami, tak samo jak woźny przechodzący obok ekranu z members tabela na wyświetlaczu.

Tworzenie soli i haszowanie PW

' salt size is 32 (0-31
Private Const SaltSize As Integer = 31
...

Dim dbPW As String = TextBox1.Text
Dim dbSalt = CreateNewSalt(SaltSize)
' eg: "dsEGWpJpwfAOvdRZyUo9rA=="

Dim SaltedPWHash As String = GetSaltedHash(dbPW, dbSalt)
' examples:
' using SHA256: bbKN8wYYgoZmNaG3IsQ2DPS2ZPIOnenl6i5NwUmrGmo=
' using SHA512: 
' 0vqZWBIbOlyzL25l9iWk51CxxJTiEM6QUZEH1ph+/aNp+lk4Yf8NYv8RLhYtbqCNpOqO3y8BmM+0YWtbAhE+RA=="

Przechowuj skrót PW i sól jako część rekordu użytkownika. Sól nie jest tajna, ale zmień ją, gdy/jeśli użytkownik zmieni swoje hasło.

Porównanie próby logowania

' check if PW entered equals DB
Dim pwTry = TextBox2.Text
' hash the login attempt using the salt stored in the DB
Dim pwLogin = GetSaltedHash(pwTry, dbSalt)

' compare the hash of what they entered to whats in the DB:
If String.Compare(SaltedPWHash, pwLogin, False) = 0 Then
    ' okay!
    Console.Beep()
End If

Jeśli użytkownik wprowadzi to samo PW, powinno to skutkować tym samym hashem, to takie proste. Kod mieszający nie jest aż tak skomplikowany:

Metody haszowania

Private Function GetSaltedHash(pw As String, salt As String) As String
    Dim tmp As String = pw & salt

    ' or SHA512Managed
    Using hash As HashAlgorithm = New SHA256Managed()
        ' convert pw+salt to bytes:
        Dim saltyPW = Encoding.UTF8.GetBytes(tmp)
        ' hash the pw+salt bytes:
        Dim hBytes = hash.ComputeHash(saltyPW)
        ' return a B64 string so it can be saved as text 
        Return Convert.ToBase64String(hBytes)
    End Using

End Function

Private Function CreateNewSalt(size As Integer) As String
    ' use the crypto random number generator to create
    ' a new random salt 
    Using rng As New RNGCryptoServiceProvider
        ' dont allow very small salt
        Dim data(If(size < 7, 7, size)) As Byte
        ' fill the array
        rng.GetBytes(data)
        ' convert to B64 for saving as text
        Return Convert.ToBase64String(data)
    End Using
End Function
  • Kuszące jest użycie czegoś takiego jak identyfikator GUID (System.Guid.NewGuid.ToString ) jako sól, ale użycie kryptograficznego generatora liczb losowych nie jest wcale takie trudne.
  • Podobnie jak w przypadku haszowanego hasła, zwrotny ciąg znaków jest dłuższy z powodu kodowania.
  • Utwórz nową sól za każdym razem, gdy użytkownik zmieni swoje hasło. Nie używaj globalnej soli, to jest sprzeczne z celem.
  • Możesz także wielokrotnie haszować hasło PW. Kluczem jest to, aby wypróbowanie wszystkich różnych kombinacji, jeśli/kiedy zostaniesz zaatakowany, zajęło dużo czasu.
  • Funkcje są idealnymi kandydatami do Shared / static członkowie klasy.

Zwróć też uwagę na artykuł, do którego prowadzi link Kenneth warto przeczytać.

Pamiętaj, że artykuł wspomina The salt should be stored in the user account table alongside the hash Nie oznacza to, że musisz mieć Salt kolumna w DB. W artykule, do którego prowadzi link, możesz zobaczyć, co następuje:

Dim dbPW As String = TextBox1.Text
Dim dbSalt = CreateNewSalt(SaltSize)

' get the salted PW hash
Dim SaltedPWHash As String = GetSaltedHash(dbPW, dbSalt)
' store salt with the hash:
SaltedPWHash = String.Format("{0}:{1}", dbSalt, dbPW)
' salt + ":" + hashed PW now ready to store in the db

Aby oddzielić sól od zaszyfrowanego hasła:

Dim SaltAndPWHash = rdr.Item("PWHash").ToString()

Dim split = SaltAndPWHash.Split(":"c)    ' split on ":"
Dim Salt = split(0)                      ' element(0) == salt
Dim StoredPWHash = split(1)              ' element(1) == hashed PW

Potrzebujesz obu części:po zahaszowaniu próby logowania w PW porównaj ją z split(1) .



  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 przyciąć tabelę w MySQL

  2. Instalacja MySQL:BŁĄD:Nie udało się zbudować natywnego rozszerzenia gem

  3. Dlaczego liczby całkowite w krotce wiersza bazy danych mają sufiks „L”?

  4. Python:najlepsze praktyki i najbezpieczniejszy sposób łączenia się z MySQL i wykonywania zapytań

  5. MySQL:najszybszy sposób liczenia wierszy