[mysql]是安全地存储在数据库中的用户名和密码吗?

标签: Vb.net MySQL .Net
发布时间: 2017/4/8 17:49:00
注意事项: 本文中文内容可能为机器翻译,如要查看英文原文请点击上面连接.

我有提交一个用户名和密码,然后在一个家族的人,我需要知道它是否安全地使用此代码,提交到数据库或如果它是更安全的数据库中。

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()

我使用参数来避免 SQL 注入式攻击。

----------------------------------------------------------------------------------

这不是重复,因为它是在不同的要求,将密码存储方式。它使用 MD5 哈希密码。

解决方法 1:

提供基本的措施,安全存储密码的过程是相当简单的︰

  • 哈希密码用盐
  • 每个密码使用一种不同的盐
  • 在数据库中存储哈希密码与盐
  • 当他们尝试登录时,运行什么企图在 PW 通过同样的方法;结果进行比较。

如果他们输入正确的密码,将匹配散列的 PWs。 哈希保护用户免受攻击,以及看门人路过与屏幕 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=="

作为用户记录的一部分存储的密码哈希值和盐。 盐不是秘密,但改变它当 / 如果用户更改他们的密码。

比较登录尝试

' 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

如果用户输入相同的密码,它应导致相同的哈希值,它是那样简单。 哈希代码不是那么复杂的︰

哈希方法

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 类成员。

此外注意文章链接到由肯尼斯是很值得一读。


请注意,这篇文章也提到 The salt should be stored in the user account table alongside the hash 这并不意味着你必须有 Salt 的 DB 中的列。 您可以看到以下正在进行链接的文章︰

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

你需要两个部分︰ 你哈希密码尝试的登录后,比较它到 split(1)

官方微信
官方QQ群
31647020