【问题标题】:Using Access to store Usernames and Passwords and opening via Visual Basic使用 Access 存储用户名和密码并通过 Visual Basic 打开
【发布时间】:2011-09-01 14:28:44
【问题描述】:

基本上我正在尝试创建一个需要一些授权的程序。

当应用程序启动时,它会直接进入登录屏幕。

我希望用户名和密码文本框读取数据库,如果它们匹配,则进入下一个表单,但如果它们不匹配,则会出现一个消息框。

我还想创建一组人,所以如果某组人登录,他们会转到某个表单,如果另一组人登录,我希望他们转到不同的表单。

我还希望密码框是 * 而不是可见文本。

谁能帮忙,这是我目前的代码...

dbProvider = "PROVIDER=Microsoft.Jet.OLEDB.4.0;" dbSource = "数据源 = D:/Users.mdb"

    con.ConnectionString = dbProvider & dbSource

    con.Open()


    sql = "SELECT * FROM tblUsers"
    da = New OleDb.OleDbDataAdapter(sql, con)
    da.Fill(ds, "Users")

    con.Close()

    MaxRows = ds.Tables("Users").Rows.Count
    inc = -1


    If UserIDTextBox.Text = ds.Tables("tblUsers").Rows(0).Item("UserID") & User_PasswordTextBox.Text = ds.Tables("tblUsers").Rows(0).Item("Password") Then
        MsgBox("This have worked correctly!")
    Else
        MsgBox("This has not worked, try again!")
    End If

【问题讨论】:

  • 永远不要永远将密码存储在数据库或其他任何地方。您需要对密码进行加密散列并仅存储散列结果。
  • 好的...你是怎么做到的?

标签: sql vb.net ms-access-2007


【解决方案1】:

您需要知道的第一件也是最重要的事情是,编写自己的身份验证系统几乎总是一个坏主意。这样做非常容易,看起来似乎是正确的,甚至通过了所有测试,但仍然存在细微的、难以发现的错误,直到一年后你发现六个月前你被破解了。始终尽可能地依赖于您的平台上提供给您的任何身份验证功能。

接下来您需要知道的是,您不会将密码存储在数据库中。曾经。处理密码匹配的正确方法是使用盐以某种简单的方式更改原始密码,以便简单的字典密码现在不再产生可以通过 google 查找轻松反转的值,然后使用加密散列像 bcrypt、scrypt 或(如果你真的需要)sha1 这样的算法。不要使用 md5。这方面的例子在谷歌上很容易找到,并且会比我在这里解释得更好。当有人想登录时,您对他们尝试的密码执行相同的步骤,现在只比较哈希值。如果您不这样做,那么您的用户密码成为公众所知只是时间问题。

接下来,我注意到代码中的数据库连接处理存在问题。您拥有的代码不能保证关闭连接。 con.Close() 应该始终在 finally 块中,并且出于偏好,我喜欢 Using 块的简写。

最后,在接近底部的地方,您尝试使用 VB 的字符串连接运算符 (&) 作为逻辑 AND。哎呀。您想在此处改用 AndAlso 运算符。

【讨论】:

  • 好的,你有什么链接可以让我学习如何在 bcrypt 或 scrypt 中编码吗?或者我可以查看的任何代码?
【解决方案2】:

山姆,

首先我第二次是乔尔所说的,对密码进行哈希处理。这是一个链接:What is the easiest way to encrypt a password when I save it to the registry?

对于文本框,只需将 PasswordChar 属性设置为 *,它就会屏蔽字符。您还可以限制长度。

至于只允许某些组,如果您在 windows 域中,则应使用活动目录组。要确定某人是否是组的成员,您可以执行以下操作:

def IsMemberOfAdGroup(grouName as string):
    windID = System.Security.PrincipalWindowsIdentity.GetCurrent()
    return System.Security.PrincipalWindowsPrincipal(windID).IsInRole(grouName)

【讨论】:

    【解决方案3】:

    这看起来是一个非常好的页面,涵盖了您要完成的任务。

    ASP.NET 2.0 Forms Authentication Using Access Database

    【讨论】:

      猜你喜欢
      • 2015-08-14
      • 2013-12-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-12-27
      • 2011-06-28
      • 2015-04-12
      • 1970-01-01
      相关资源
      最近更新 更多