sql >> Database >  >> RDS >> Mysql

Is het veilig om gebruikersnamen en wachtwoorden in de database op te slaan?

Het proces voor het opslaan van wachtwoorden met een basismaatregel van beveiliging is vrij eenvoudig:

  • Hash de wachtwoorden met zout
  • Gebruik een andere salt voor elke gebruiker/wachtwoord
  • Sla de salt met het gehashte wachtwoord op in de DB
  • Als ze proberen in te loggen, voer je de poging tot PW uit via dezelfde methode; vergelijk het resultaat.

Als ze het juiste wachtwoord hebben ingevoerd, komen de gehashte PW's overeen. Hashing beschermt de gebruikers tegen aanvallen en de conciërge die langs een scherm loopt met de members tafel tentoongesteld.

Zout maken en de PW hashen

' 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=="

Bewaar de PW-hash en het zout als onderdeel van het gebruikersrecord. Het zout is niet geheim, maar verander het wanneer/als de gebruiker zijn wachtwoord verandert.

Een inlogpoging vergelijken

' 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

Als de gebruiker dezelfde PW invoert, zou dit dezelfde hash moeten opleveren, zo simpel is het. De hash-code is niet zo ingewikkeld:

Hash-methoden

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
  • Het is verleidelijk om zoiets als een GUID te gebruiken (System.Guid.NewGuid.ToString ) als het zout, maar het is gewoon niet zo moeilijk om de cryptografische generator voor willekeurige getallen te gebruiken.
  • Net als bij het gehashte wachtwoord is de return-string langer vanwege de codering.
  • Maak een nieuwe salt elke keer dat de gebruiker zijn wachtwoord wijzigt. Gebruik geen globaal zout, het verslaat het doel.
  • Je kunt de PW ook meerdere keren hashen. Een deel van de sleutel is om het lang te laten duren om alle verschillende combinaties te proberen als/wanneer ze worden aangevallen.
  • De functies zijn ideale kandidaten voor Shared / static klasleden.

Let ook op het artikel waarnaar wordt gelinkt door Kenneth is het lezen waard.

Merk op dat het artikel vermeldt The salt should be stored in the user account table alongside the hash Dit betekent niet dat je een Salt . moet hebben kolom in de DB. U kunt zien dat het volgende wordt gedaan in het gelinkte artikel:

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

Om het zout van het gehashte wachtwoord te splitsen:

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

Je hebt beide delen nodig:nadat je de poging tot inloggen in PW hebt gehasht, vergelijk het met split(1) .



  1. SELECT-lijst staat niet in GROUP BY-clausule en bevat niet-geaggregeerde kolom .... incompatibel met sql_mode=only_full_group_by

  2. MySQL integer veld wordt geretourneerd als string in PHP

  3. Een back-up maken van MySQL-databases vanaf de opdrachtregel in Linux

  4. Tel het aantal DISTINCT-waarden