处理用户帐户身份验证和密码的最佳方法

时间:2008-09-13 18:34:59

标签: security database-design authentication authorization

在不让您的员工有权访问数据库的情况下,在系统中处理用户帐户管理的最佳方式是,有权访问帐户。

示例:

  1. 在数据库中存储用户名/密码。这是个坏主意,因为任何有权访问数据库的人都可以看到用户名和密码。因此使用它。

  2. 存储用户名/密码哈希。这是一种更好的方法,但可以通过使用您知道其身份验证信息的另一个帐户的哈希值替换数据库中的密码哈希来访问该帐户。然后在授予访问权限后将其还原回数据库中。

  3. windows / * nix如何处理这个?

11 个答案:

答案 0 :(得分:5)

  

这是一种更好的方法,但可以通过使用您知道身份验证信息的其他帐户的哈希值替换数据库中的密码哈希来访问该帐户。

真的没办法解决这个问题。任何对密码文件具有写入权限的人都可以完全控制计算机。

答案 1 :(得分:4)

我要去2但是要用盐。一些伪代码:

SetPassword(user, password)
    salt = RandomString()
    hash = Hashfunction(salt+password)
    StoreInDatabase(user, salt, hash)

CheckPassword(user, password)
    (salt, hash) = GetFromDatabase(user)
    if Hashfunction(salt+password) == hash
        return "Success"
    else
        return "Login Failed"

使用在库中实现的众所周知的哈希函数(例如MD5或SHA-1)非常重要。 不要自己动手或尝试从书中实施,这样做不值得冒错。

@Brian R. Bondy:你使用salt的原因是为了让字典更难以攻击,攻击者无法对字典进行散列并尝试反对所有密码,而是必须使用salt +字典并对其进行散列,这使得存储需求得以实现。如果您有1000个最常用密码的字典并对其进行散列,则需要16 kB,但如果添加两个随机字母,则得到62 * 62 * 16kB≈62Mb。

否则你可以使用某种One-time passwords我听说过有关OTPW的好东西但没有使用它。

答案 2 :(得分:4)

这是多年前UNIX中的一个常见问题,通过将用户身份组件(用户名,UID,shell,全名等)与身份验证组件(密码哈希,密码哈希盐)分开来解决。标识组件可以是全局可读的(实际上必须是,如果要将UID映射到用户名),但是用户必须必须认证组件。要对用户进行身份验证,请拥有一个可信系统,该系统将接受用户名和密码,并返回“已验证”或“未经过身份验证”的简单结果。该系统应该是唯一可以访问身份验证数据库的应用程序,并且应该在回复之前等待一段随机时间(可能在0.1到3秒之间)以帮助避免计时攻击。

答案 3 :(得分:3)

您可以使用openID并且根本不保存任何机密用户密码。谁说它只适用于网站?

答案 4 :(得分:3)

杰夫阿特伍德有一些关于哈希的好帖子,如果你决定走这条路:

答案 5 :(得分:2)

  1. 确实是一个非常糟糕的主意。如果数据库遭到入侵,则所有帐户都会受到损害。
  2. 好的方式去。如果您的哈希算法包含用户名,则用另一个密码哈希替换密码哈希将不起作用。
  3. Unix在文本文件/ etc / shadow中存储哈希值,只有特权用户才能访问它。密码用盐加密。

答案 6 :(得分:0)

您可以将哈希密码的 salt 存储在另一个表中,当然每个用户都有自己的盐。然后,您可以限制对该表的访问。

答案 7 :(得分:0)

通常的方法是使用选项二和电子邮件:

将用户名,密码哈希和电子邮件地址存储到数据库中。

用户可以输入密码或重置密码,在后一种情况下会生成一个随机密码,为用户创建一个新的哈希,并通过电子邮件将密码发送给他。

编辑:如果数据库遭到入侵,那么您只能保证无法访问合理的信息,您无法再确保应用程序的安全性。

答案 8 :(得分:0)

将用户名和密码混合在一起。这样,如果两个用户拥有相同的密码,则哈希值仍然不同。

答案 9 :(得分:0)

对于许多应用程序来说,这是一个非问题,因为获得对数据库的访问可能是任何攻击者最常见的目标。因此,如果他们已经可以访问数据库,为什么他们仍然想要登录到应用程序? :)

答案 10 :(得分:0)

如果'系统'是公共网站,RPX可以为最常见的提供商提供登录/用户帐户服务,例如OpenId,Facebook,Google等。

现在,考虑到你制定问题的方式,我猜你所谈论的'系统'更可能是一个基于Windows / Linux的内部企业应用程序。尽管如此;对于那些在网上搜索登录/用户帐户提供商的人(就像我在遇到RPX之前所做的那样),这可能非常适合:)