2016-07-24 164 views
0

我正在为学校编码密码管理器,我想知道我应该改进或改变什么。 这是如何工作的:密码管理器安全

要保存主密码,我创建了一个文件,密码与PBKDF2 512bytes output密码散列在SHA3-512之上。使用随机128byte盐和随机数的迭代(这是问题的重点)。 所有这些数据都保存在文件中,并使用伪随机生成器进行加密,该生成器从密码本身生成种子(这种方法更难获得盐)。

然后存储密码的文件使用AES 256进行加密,盐由用户PC伪唯一标识符生成。

当用户选择密码时,要求是:最低10个字符,而不是成为100.000最常用的密码列表(我在互联网上得到了这个名单的地方,可能已过时)

好吧,我有问题,它们是:PBKDF2的当前标准迭代计数是多少? 是PBKDF2输出字节长度重要吗?我的意思是更多的长度=更安全?

而且会更长的盐给我额外的安全性?

它保存在文件中的盐因此它是“可能”检索它,有没有更好的方法来“隐藏”它,而不是只是加扰字节?

+0

re:迭代计数:我通常在野外看到5k-20k,但是非固定计数是更好的。也许把第一个字母的ascii值加到count中,这样像john the ripper这样的东西就有93倍的难度。 – dandavis

回答

2

PBKDF2的当前标准迭代计数是多少?

有没有。迭代计数未在标准文档中指定。尽可能多地使用,而不会让用户烦恼。请记住,这通常是通过设置一个目标时间(对于实际硬件)来确定的,例如0.1秒到2秒,然后尝试多次迭代计数以更接近该标记(如果不使用二进制搜索没有可以放弃的日志记录的PBKDF2实现)。

当然,你不应该自己定义迭代次数,而应该让用户定义它(Keepass就是这样做的)。它基本上是一个目标时间的基准。

迭代次数是PBKDF2中安全性的主要驱动因素,并且基本上是攻击者的减速,前提是您不要求更多的输出即底层哈希函数的输出大小。

PBKDF2是输出字节长度重要吗?我的意思是更多的长度=更安全?

是的,它很重要,但只能达到一个点。如果输出很小(比如说64位),那么发现一个冲突(一些输入散列到同一个输出)比一个128位输出的散列更容易找到。这就是为什么现在不应该使用短散列函数的原因。任何输出256位的东西都可以。请注意,SHA-512可以在SHA-256的64位平台上运行得更快。

而且会更长的盐给我额外的安全性?

不,盐是在那里区分多次使用相同的密码或密钥。使用相同的 salt可以使窃取密码数据库的攻击者同时暴力破解所有用户的密码,而不是一个接一个地破解密码。有一个64位或128位盐足以防止彩虹表的生成(但大量迭代计数基本上需要照顾)。

只有当您认为攻击者可以同时对用户的多个密码容器执行离线强力攻击(因此可以事先分配给多个用户计算机)时,才有相关性。

盐其保存在该文件,因此它的“可能”进行检索,是 有没有更好的方式来“隐藏”它不仅仅是加扰字节?

不,盐不应该是秘密的。它的唯一目的是甚至是输出的随机化,尤其是当使用相同的密码时。简单地从一个好的随机源生成一个随机盐并按原样存储它。当然,如果您使用经过身份验证的加密(AES-GCM或类似的),那么您应该将盐作为附加的验证数据传递以检测(恶意)操作。


有用的资源:pbkdf-2标签上Cryptography