什么是最好的方式来处理用户账户管理系统,而无需你的雇员有权访问数据库,获取帐户。

实例:

  1. 储存用户名和密码的数据库。这是一个糟糕的想法,因为任何人都有权访问数据库可以看到用户名和密码。因此使用它。

  2. 存储username/password hash.这是一个更好的方法,但是,账户可以通过更换密码哈希数据库中的散列的另一个帐户,你知道的身份验证的信息。然后访问是授予恢复回去的数据库。

怎么windows/*nix处理这个吗?

有帮助吗?

解决方案

这是一个共同的问题在UNIX许多年前,并决心通过分离的用户身份的部件(用户名,UID、外壳完整的名称、等等)。 从认证组(哈希密码、密码哈希盐)。身份成分可以是全球可读(和事实上的必须,如果Uid要映用户名),但认证组 必须 保持无法进入的用户。对用户进行身份验证,有一个受信赖的系统,该系统将接受一个用户名和密码,以及将会返回一个简单的结果,"认证"或"未经过身份验证".这种系统应该是唯一的应用程序,与获得认证数据库,并应等待一个随机的一段时间(可能是之间的0.1和3秒)之前作出答复,以帮助避免时机的攻击。

其他提示

这是一个更好的方法,但是,账户可以通过更换密码哈希数据库中的散列的另一个帐户,你知道的身份验证的信息。

真的没有办法解决这个问题。谁写的访问密码文件已经完全控制计算机。

我会去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.邦迪:因为你使用盐是做字典attaks难,攻击者不能哈希字典,并尝试对所有的密码,不是她必须把盐+典和散,这使得存储requierments expode.如果你有一个词典的1000多数commaon密码和散他们,你需要的东西喜欢16kB但如果你增加的两个随机的字母你62*62*16 kB≈62Mb。

还有你可以使用某种类型的 一次性密码 我有听说过好的事情OTPW但还没有使用过它。

杰夫*阿特伍德拥有一些良好的职位有关的散列,如果你决定要去那的路线:

你可以使用openID和保存保密的用户密码。谁说它是网站唯一?

  1. 一个非常糟糕的主意的确。如果数据库受到损害,所有帐户都受到损害。
  2. 好的路要走。如果你的散列算法包括用户名,替换密码散与另外一个不会的工作。

Unix存储哈希在一个文本文件/etc/阴影,这只能访问到的特权用户。密码加密的用盐。

你可以储存 为散列的密码在另一个表,当然每个用户都有自己的盐。然后您可以限制访问这些表格。

通常的做法是,使用选择两个电子邮件:

储存用户名、口令散和电子邮件地址进入的数据库。

用户可以输入密码或重置的,在后一种情况下一个随机的密码产生,一个新的散列为用户创建和密码发送给他通过电子邮件。

编辑:如果数据库受到损害,那么你只能保证不明智的信息,可访问,你不能再确保安全的应用程序。

散列的用户名和密码 一起.这样,如果两个用户拥有相同的密码,散列将仍然是不同的。

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

如果"系统"是一个公共网站 根据 可以为你提供一个登录/用户账户服务,对于最常见的供应商,如OpenId,Facebook,Google,等等。

现在,给你的方式制定你的问题我的猜测"系统"你说的是更可能是内部windows/linux基础的企业应用程序。尽管如此;对于那些在谷歌上搜索周围的登录/用户账户提供商(如我之前遇到的根据),这可能是一个良好的配合:)

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top