Mysql
 sql >> база данни >  >> RDS >> Mysql

Безопасно ли е да съхранявате потребителски имена и пароли в базата данни?

Процесът за съхраняване на пароли с основна мярка за сигурност е доста прост:

  • Хеширайте паролите със сол
  • Използвайте различна сол за всеки потребител/парола
  • Съхранете солта с хеширана парола в DB
  • Когато се опитат да влязат, стартирайте опитания PW чрез същия метод; сравнете резултата.

Ако са въвели правилната парола, хешираните PW ще съвпадат. Хеширането защитава потребителите от атаки, както и портиерът, който минава покрай екран с members таблица на дисплея.

Създаване на сол и хеширане на 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=="

Съхранявайте PW хеша и солта като част от записа на потребителя. Солта не е тайна, но я сменете, когато/ако потребителят промени паролата си.

Сравняване на опит за влизане

' 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

Ако потребителят въведе същия PW, това трябва да доведе до същия хеш, толкова е просто. Хеш-кодът не е толкова сложен:

Методи за хеширане

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
  • Изкушаващо е да използвате нещо като GUID (System.Guid.NewGuid.ToString ) като солта, но просто не е толкова трудно да използвате криптографския генератор на случайни числа.
  • Както при хешираната парола, връщаният низ е по-дълъг поради кодирането.
  • Създавайте нова сол всеки път, когато потребителят промени паролата си. Не използвайте глобална сол, тя побеждава целта.
  • Можете също да хеширате PW няколко пъти. Част от ключа е да отнеме много време, за да опитате всички различни комбинации, ако/когато бъдат атакувани.
  • Функциите са идеални кандидати за Shared / static членове на класа.

Забележете също, че статията, към която е свързана от Kenneth заслужава си да се прочете.

Имайте предвид, че статията споменава The salt should be stored in the user account table alongside the hash Това не означава, че трябва да имате Salt колона в БД. Можете да видите, че се прави следното в свързаната статия:

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

За да разделите солта от хешираната парола:

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

Трябват ви и двете части:след като хеширате опитания за влизане в PW, сравнете го с 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. MySQL каза:Документация #1045 - Достъпът е отказан за потребител 'root'@'localhost' (използвайки парола:НЕ)

  2. mySQL конвертира varchar към дата

  3. Възстановете структурата на таблицата от frm и ibd файлове

  4. Percona Live Dublin – Резюме на събитието и нашите сесии

  5. Как мога да върна изхода на централната таблица в MySQL?