当前位置: 首页 > 面试题库 >

将用户名和密码存储在数据库中是否安全?

马天逸
2023-03-14
问题内容

我让人们在氏族中提交用户名和密码,然后我需要知道使用此代码将其提交到数据库中是否安全,或者在数据库中是否安全。

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哈希密码。


问题答案:

具有基本安全性的密码存储过程非常简单:

  • 用盐散列密码
  • 为每个用户/密码使用不同的盐
  • 将带有哈希密码的盐存储在数据库中
  • 当他们尝试登录时,请通过相同的方法运行尝试的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)



 类似资料:
  • 我知道在java源代码中以字符串形式存储密码是不安全的。通常,最好将其存储在具有char[]类型的变量中。以以下形式存储密码安全吗? 字符串“my password”是否出现在编译的java类文件中?在我看来,在编译源代码之后,“我的密码”不会出现在我的类文件中。但我仍然不能100%确定我可以使用描述的表示来存储密码。 我能否安全地使用这个结构,并确保密码受到保护,除非有人从源代码中获取密码? 编

  • 问题内容: 在Redis中可以使用用户名,密码和数据库吗? 这个问题的原因是因为在官方的 pyramid_redis_sessions 文档(http://pyramid-redis- sessions.readthedocs.io/en/latest/gettingstarted.html )中,该参数… …(例如,在Python / Pyramid内部使用)建议使用用户名,密码和db。 但是,

  • 我已经在谷歌上搜索了两个星期了,没有任何效果。我只想知道如何检查给定的用户名是否存在于我的MySQL数据库表中。表名为用户。但是它似乎绕过了我的if语句,直接添加用户名,导致我的表有相同用户名的重复。我试过很多代码,也试过很多方法。一直在使用MySQL,因为这是我们现在应该使用的。我可以给你我尝试过的任何方法,但这是我第100次尝试的最新方法。请注意,我知道这还没有完全准备好抵御SQL注射,我现在

  • 我正在构建一个Java Web应用程序,当经理批准他们的请求时,它会自动授予用户对其Windows PC的管理权限。 为了实现这一点,我将编写一个脚本来自动远程访问用户的计算机,并将他们添加到计算机的管理组中。我想为了做到这一点,我需要一个管理服务帐户来访问所有的计算机。 我的问题是,我如何安全地存储管理服务帐户信息?应用程序每次需要访问并授予用户管理员权限时都需要凭据,那么我如何让应用程序在没有

  • 问题内容: 因此,基本上,我想在注册表格中添加一个功能,该功能将检查数据库中是否已存在该用户名。 我对AJAX有几个问题- 1)我想创建一个AJAX请求on_change函数,所以像这样- 因此,据我所知,我必须在validation.php文件中包含所有在PHP中进行的验证,对吗?是否需要任何特殊的验证,或者只是使用sql语句进行的简单验证- 2)据我所知,我也必须通过$ .ajax传递POST

  • 我目前正在使用ReactJS构建一个单页应用程序。 我读到不使用的原因之一是因为XSS漏洞。 由于 React 会转义所有用户输入,现在使用 是否安全?