sql >> Database teknologi >  >> RDS >> Mysql

Er det sikkert at gemme brugernavne og adgangskoder i databasen?

Processen til at gemme adgangskoder med et grundlæggende sikkerhedsmål er ret enkel:

  • Hash adgangskoderne med salt
  • Brug et forskelligt salt for hver bruger/adgangskode
  • Gem saltet med den hash-kodede adgangskode i databasen
  • Når de forsøger at logge ind, så kør hvad den forsøgte PW gennem den samme metode; sammenligne resultatet.

Hvis de indtastede den korrekte adgangskode, vil de hasherede PW'er matche. Hashing beskytter brugerne mod angreb såvel som pedellen, der går forbi en skærm med members bord udstillet.

Oprettelse af salt og hash af 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=="

Gem PW-hashen og saltet som en del af brugerens registrering. Saltet er ikke hemmeligt, men skift det når/hvis brugeren skifter adgangskode.

Sammenligning af et loginforsøg

' 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

Hvis brugeren indtaster den samme PW, skulle det resultere i den samme hash, så simpelt er det. Hashingkoden er ikke så kompliceret:

Hash-metoder

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
  • Det er fristende at bruge noget som en GUID (System.Guid.NewGuid.ToString ) som saltet, men det er bare ikke så svært at bruge den kryptografiske tilfældige talgenerator.
  • Som med den hash-kodede adgangskode er returstrengen længere på grund af kodningen.
  • Opret et nyt salt, hver gang brugeren ændrer sin adgangskode. Brug ikke et globalt salt, det besejrer formålet.
  • Du kan også hash PW flere gange. En del af nøglen er at få det til at tage lang tid at prøve alle forskellige kombinationer, hvis/når det bliver angrebet.
  • Funktionerne er ideelle kandidater til Shared / static klassemedlemmer.

Bemærk også artiklen, der linkes til af Kenneth er værd at læse.

Bemærk, at artiklen nævner The salt should be stored in the user account table alongside the hash Dette betyder ikke, at du skal have en Salt kolonne i DB. Du kan se følgende gøres i den linkede 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

Sådan opdeles saltet fra den hash-kodede adgangskode:

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

Du har brug for begge dele:efter at du hash det forsøgte at logge på PW, skal du sammenligne det med split(1) .



  1. 4 måder at forhindre alarmoverbelastning med SQL Server-overvågning

  2. Gennemfør Laravel 8 Soft Slet &Gendan slettede optegnelser Tutorial

  3. Hvordan TIME() virker i MariaDB

  4. Hvordan henter man den aktuelle version af et MySQL-databasestyringssystem (DBMS)?