我正在编写用户登录系统的第一次尝试,希望能把它做好。我觉得我在这里处于重复的领域,但就我所有的阅读而言,我无法找到几个问题的可靠答案。但是,如果我遗漏了什么,请随时为我指出正确的方向。
我将对所有密码使用每个用户 128 位盐,并强制执行“强”(我知道是主观的!)密码,但无法找出最好的哈希方法,所以,
会使用
CRYPT_SHA512
随着迭代 像使用一样强大CRYPT_BLOWFISH
?和有什么区别 在 CRYPT_SHA512 与 迭代和重复hash_hmac
使用sha512
一个大的) 次数。有比 另一个是推荐的 哈希密码?我问是因为 我正在使用 Kohana 和默认值auth
实现用途hash_hmac
.我不认为它会 太难添加迭代 那(我将不得不 修改它以添加每个用户盐 无论如何),这让我想到了 ..是否有一个模块可以做到这一点? 小花(3.1)?在我开始写我的之前 拥有,如果那里有东西 很合适,我很乐意使用 那。所以,执行的东西 哈希拉伸(stretch)(无论是 bcrypt 还是 sha512) 并允许每个用户加盐。 最后,
...正如评论中所指出的,问题 4 实际上是一个完全独立的问题,因此我将其删除。随意忽略它。我不会完全编辑它的唯一原因是它已经在答案中被引用。
<罢工>
4. 我的系统将允许具有不同权限的用户。
有些将是管理员
完全权利,一些开发商
权利略少,一路走好
直到有权限的匿名用户
例如,只留下评论。
我找不到任何
关于这个的信息真的。什么
是存储用户的“正确”方式
数据库中的帐户类型。一种
幼稚的第一个想法是一个简单的
用户表中的整数将
够了,但我忍不住想
这是一个非常糟糕的主意。如果
有人掌握了数据库
不难找出哪个
int
代表管理员,
那么他们只需要蛮力
一个密码即可获得完全访问权限
权利。简单地就足够了吗
散列帐户类型整数和
存储它,或者我应该寻找
在另一种方法?
罢工>
最佳答案
问题1-3的答案实际上是一个答案,由几个部分组成。
首先,您应该使用带有每个用户盐的强哈希。我特别建议 PBKDF2,这是一个有用的系统。这包括迭代。
您对 bcrypt 的引用有点不同。密码应该始终是单向散列的。您可以使用 PBKDF2 或 hmac 之类的函数来执行此操作。您不应该使用可逆算法。 但是最好是将盐存储在远离散列本身的地方。这样做的一个建议是使用从文件系统而不是数据库访问的 key 对盐进行 bcrypt。最好在具有 600 权限的文件中,该文件由网络服务器用户以外的其他人拥有并由 setuid 等加载。这样即使数据库遭到破坏,仍然没有足够的信息来推导出密码。
第 4 部分是关于存储 ACL 的数据结构。有lots of options为此,请环顾四周寻找适合您的东西。您可能不需要完整的 ACL,而只需拥有用户角色/组或特定的权限标志。这将取决于您的应用。
关于php - CRYPT_SHA512 是否具有与 bcrypt 一样强大的迭代(以及相关问题),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6343035/