CRYPT_SHA512的迭代是否与bcrypt一样强(以及相关问题)


Is CRYPT_SHA512 with iterations as strong as bcrypt (and related questions)

我正在编写一个用户登录系统的第一次尝试,希望能做对。我觉得我在这里处于重复的领域,但我读了很多书,都没能找到几个问题的确切答案。然而,如果我错过了什么,请随时为我指明正确的方向。

我将在所有密码上使用每个用户128位的salts,并强制执行"强"(主观我知道!)密码,但无法找出散列它们的最佳方法,因此,

  1. CRYPT_SHA512与迭代一起使用像使用一样强壮CRYPT_BLOWFISH

  2. 区别在哪里介于CRYPT_SHA512与迭代和重复hash_hmac使用sha512a(大)次数。一个比另一个和推荐的用于散列密码?我问是因为我使用Kohana和默认auth实现使用hash_hmac。我认为不会太难添加迭代我将不得不修改为添加每个用户的盐无论如何),这让我想到。。

  3. 是否已有模块可用于执行此操作Kohana(3.1)?在我开始写我的自己的,如果有什么我很乐意使用那个所以,一些表现散列拉伸(无论是bcrypt还是sha512),并且允许每个用户的盐。最后,

。。。正如评论中所指出的,问题4实际上是一个完全独立的问题,所以我要去掉它。可以忽略它。我不会完全编辑它的唯一原因是它已经在答案中被引用了

4.我的系统将允许用户拥有不同的权限。有些将是管理员完全权利,一些开发商权利稍微少一点一直到拥有权限的匿名用户例如,只留下评论。我一直找不到关于这个的信息真的。什么是存储用户的"正确"方式数据库中的帐户类型。A.天真的第一个想法是用户表中的整数够了,但我忍不住想这是个非常糟糕的主意。如果有人掌握了数据库不难弄清楚哪一个CCD_ 7表示管理员,那么他们只需要暴力一个密码即可获得完全访问权限权利。仅仅散列帐户类型integer和把它存起来,或者我应该找一下用另一种方法?

问题1-3的答案实际上是一个答案,由几个部分组成。

首先,您应该使用具有每个用户盐的强散列。我特别建议PBKDF2,它是一个有用的系统。这包括迭代。

您对bcrypt的引用有点不同。密码应该始终是单向散列的。您可以使用像PBKDF2或hmac这样的函数来执行此操作。你不应该使用可逆算法然而如果你能把盐储存在远离哈希本身的地方,那就最好了。这样做的一个建议是使用从文件系统而不是数据库访问的密钥对salt进行bcrypt。优选地,在具有600个权限的文件中,该文件由网络服务器用户以外的人拥有并且由setuid等加载。这样,即使数据库被破坏,仍然没有足够的信息来导出密码。

第4部分是关于存储ACL的数据结构。有很多选择,所以四处看看适合你的。您可能不需要完整的ACL,而只需要用户角色/组或特定的权限标志。这将取决于您的应用程序。