sql >> Databáze >  >> RDS >> Mysql

Je bezpečné ukládat uživatelská jména a hesla do databáze?

Proces ukládání hesel se základní mírou zabezpečení je poměrně jednoduchý:

  • Hašujte hesla solí
  • Pro každého uživatele/heslo použijte jinou sůl
  • Uložte sůl s hashovaným heslem do DB
  • Když se pokusí přihlásit, spusťte to, o co se pokusili PW, stejnou metodou; porovnejte výsledek.

Pokud zadali správné heslo, hashované PW se budou shodovat. Hašování chrání uživatele před útoky a také správce, který prochází kolem obrazovky s members vystavený stůl.

Vytvoření soli a hašování 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=="

Uložte PW hash a sůl jako součást uživatelského záznamu. Sůl není tajná, ale změňte ji, když/pokud uživatel změní své heslo.

Porovnání pokusu o přihlášení

' 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

Pokud uživatel zadá stejné PW, mělo by to mít za následek stejný hash, je to tak jednoduché. Hašovací kód není tak složitý:

Hašovací metody

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
  • Je lákavé použít něco jako GUID (System.Guid.NewGuid.ToString ) jako sůl, ale použití kryptografického generátoru náhodných čísel není tak těžké.
  • Stejně jako u hashovaného hesla je návratový řetězec delší kvůli kódování.
  • Vytvořit novou sůl pokaždé, když uživatel změní heslo. Nepoužívejte globální sůl, marí to účel.
  • PW můžete hashovat také několikrát. Součástí klíče je, aby v případě napadení trvalo dlouho zkoušení všech různých kombinací.
  • Funkce jsou ideálními kandidáty pro Shared / static členové třídy.

Všimněte si také článku, na který odkazuje Kenneth stojí za přečtení.

Všimněte si, že článek zmiňuje The salt should be stored in the user account table alongside the hash To neznamená, že musíte mít Salt sloupec v DB. V odkazovaném článku můžete vidět následující provádění:

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

Chcete-li oddělit sůl z hashovaného hesla:

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

Potřebujete obě části:po zahašování pokusu o přihlášení PW jej porovnejte s split(1) .



  1. Jak automatizovat sběr dat při růstu databáze SQL Server

  2. Jak vyplnit řetězec úvodními/koncovými znaky v MySQL – LPAD(), RPAD()

  3. Systém automatického e-mailu pro odeslání souhrnné zprávy databáze

  4. Cizí klíč PostgreSQL neexistuje, problém dědičnosti?