sql >> Databasteknik >  >> RDS >> Mysql

Är det säkert att lagra användarnamn och lösenord i databasen?

Processen för att lagra lösenord med ett grundläggande säkerhetsmått är ganska enkel:

  • Hasha lösenorden med salt
  • Använd olika salt för varje användare/lösenord
  • Lagra saltet med det hashade lösenordet i databasen
  • När de försöker logga in, kör vad som försökte PW med samma metod; jämför resultatet.

Om de skrev in rätt lösenord kommer de hashade PW:erna att matcha. Hashing skyddar användarna från attacker såväl som vaktmästaren som går förbi en skärm med members bord på displayen.

Skapa salt och hasha 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=="

Lagra PW-hash och saltet som en del av användarens register. Saltet är inte hemligt, men ändra det när/om användaren ändrar sitt lösenord.

Jämföra ett inloggningsförsök

' 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

Om användaren anger samma PW bör det resultera i samma hash, så enkelt är det. Hashingkoden är inte så komplicerad:

Hashmetoder

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 är frestande att använda något som en GUID (System.Guid.NewGuid.ToString ) som saltet, men det är bara inte så svårt att använda den kryptografiska slumptalsgeneratorn.
  • Som med det hashade lösenordet är retursträngen längre på grund av kodningen.
  • Skapa ett nytt salt varje gång användaren ändrar sitt lösenord. Använd inte ett globalt salt, det motverkar syftet.
  • Du kan också hasha PW flera gånger. En del av nyckeln är att få det att ta lång tid att prova alla olika kombinationer om/när man attackeras.
  • Funktionerna är idealiska kandidater för Shared / static klassmedlemmar.

Observera också artikeln som Kenneth länkade till är väl värt att läsa.

Observera att artikeln nämner The salt should be stored in the user account table alongside the hash Det betyder inte att du måste ha en Salt kolumn i DB. Du kan se följande göras i den länkade artikeln:

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å här delar du saltet från det hashade lösenordet:

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 behöver båda delarna:efter att du hashat försöket att logga in PW, jämför det med split(1) .



  1. Återkomsten av XFS på Linux

  2. SQL, Unika och Primära nycklar

  3. Oracle 12.2.0.1 kommer 2016

  4. 3 sätt att få serverkollationen i MariaDB