¿Es seguro almacenar nombres de usuario y contraseñas en la base de datos?

Tengo personas que envían un nombre de usuario y una contraseña para un clan y necesito saber si es seguro usar este código para enviarlo a una base de datos o si es seguro en una base de datos.

MySQLCon.Open() Dim SQLADD As String = "INSERT INTO members(username,password) VALUES(@memberToAdd, @memberPassword)" COMMAND = New MySqlCommand(SQLADD, MySQLCon) COMMAND.Parameters.AddWithValue("@memberToAdd", memberToAdd.Text) COMMAND.Parameters.AddWithValue("@memberPassword", membersPassword.Text) COMMAND.ExecuteNonQuery() MySQLCon.Close() MySQLCon.Dispose() 

Yo uso Parámetros para evitar ataques de inyección SQL.

————————————————– ——————————–

Esto no fue un duplicado ya que era de una manera diferente de preguntar y almacenar la contraseña. Estaba usando MD5 para hashtear una contraseña.

El proceso para almacenar contraseñas con una medida básica de seguridad es bastante simple:

  • Hash las contraseñas con sal
  • Use una sal diferente para cada usuario / contraseña
  • Almacene la sal con la contraseña hash en el DB
  • Cuando intentan iniciar sesión, ejecute el bash de PW a través del mismo método; comparar el resultado

Si ingresaron la contraseña correcta, las PW hash coincidirán. Hashing protege a los usuarios de los ataques y al conserje caminando por una pantalla con la tabla de members en pantalla.

Creando Sal y Hashing el 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==" 

Almacene el hash PW y la sal como parte del registro del usuario. La sal no es secreta, pero cámbiela cuando / si el usuario cambia su contraseña.

Comparando un bash de inicio de sesión

 ' 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 

Si el usuario ingresa el mismo PW, debería dar como resultado el mismo hash, es así de simple. El código hash no es tan complicado:

Métodos Hash

 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 
  • Es tentador usar algo así como un GUID ( System.Guid.NewGuid.ToString ) como sal, pero no es tan difícil usar el generador de números aleatorios criptográficos.
  • Al igual que con la contraseña hash, la cadena de retorno es más larga debido a la encoding.
  • Crea una nueva sal cada vez que el usuario cambie su contraseña. No use una sal global, derrota el propósito.
  • También puede hash PW varias veces. Parte de la clave es hacer que tome mucho tiempo probar todas las combinaciones si / cuando es atacado.
  • Las funciones son candidatas ideales para miembros de clase Shared / static .

Tenga en cuenta también, vale la pena leer el artículo vinculado por Kenneth .


Tenga en cuenta que el artículo menciona The salt should be stored in the user account table alongside the hash Esto no significa que debe tener una columna de Salt en el DB. Puede ver lo siguiente en el artículo vinculado:

 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 

Para dividir la sal de la contraseña hash:

 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 

Necesita ambas partes: después de hash el bash de iniciar sesión en PW, compárelo con split(1) .

No, no debe almacenar una contraseña de texto claro en su base de datos.

La razón es que si su base de datos es pirateada / robada / comprometida, todas las contraseñas de sus usuarios estarán disponibles para el pirata informático.

Lo que debe hacer es lo siguiente: – Cuando un usuario se registra, guarde su nombre de usuario en la base de datos, junto con una versión hash de la contraseña – Cuando un usuario intente iniciar sesión, obtenga el nombre de usuario de la base de datos, hash la contraseña que proporcionado y compararlo con la contraseña hash en la base de datos.

Hashing es una forma de transformar una cadena en una cadena diferente, donde solo puede ir en una dirección (es decir, la misma entrada generará siempre la misma salida, pero nunca podrá recuperar la entrada si solo tiene la salida).

Para saber cómo hash una cadena, lea el siguiente artículo, tiene ejemplos de código para diferentes idiomas: https://crackstation.net/hashing-security.htm