Security 密码管理器安全性

Security 密码管理器安全性,security,encryption,hash,passwords,Security,Encryption,Hash,Passwords,我正在为学校编写一个密码管理器,我想知道我应该改进或更改什么。 这就是它的工作原理: 为了保存主密码,我创建了一个文件,其中的密码用PBKDF2 512bytes output散列在SHA3-512之上。使用随机128bytesalt和随机迭代次数(这是问题的重点)。 所有这些数据都保存在文件中,并使用伪随机生成器进行加密,该生成器的种子由密码本身生成(这种方式更难获得salt) 然后,使用AES 256对存储密码的文件进行加密,并从用户PC伪唯一标识符生成salt 当用户选择密码时,要求是:至

我正在为学校编写一个密码管理器,我想知道我应该改进或更改什么。 这就是它的工作原理:

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

然后,使用AES 256对存储密码的文件进行加密,并从用户PC伪唯一标识符生成salt

当用户选择密码时,要求是:至少10个字符,并且不在
100.000
最常用密码列表中(我在internet上的某个地方找到了此列表,可能已经过时)

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

长一点的盐能给我额外的安全感吗

salt保存在文件中,因此“可能”检索到它,有没有更好的方法“隐藏”它,而不仅仅是对字节进行置乱

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

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

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

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

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

是的,这很重要,但只是在一定程度上。如果输出很小,比如64位,那么查找冲突(某些输入散列到相同的输出)比查找128位输出的散列更容易。这就是为什么现在不应该使用短哈希函数。任何输出256位的都可以。请注意,SHA-512的实现可以使其在SHA-256支持的64位平台上运行得更快

长一点的盐能给我额外的安全感吗

不,salt用于区分同一密码或密钥的多次使用。使用相同的salt将使窃取密码数据库的攻击者能够同时而不是一个接一个地强制执行所有用户的密码。拥有64位或128位salt足以防止彩虹表的生成(但大的迭代次数基本上解决了这一问题)

只有当您认为攻击者可以同时对您用户的多个密码容器进行离线暴力攻击(从而提前入侵多个用户机器)时,才有salt

盐保存在文件中,因此“可能”检索它,是 有没有更好的方法来“隐藏”它,而不仅仅是对字节进行置乱

不,盐不应该是秘密的。它的唯一目的是对输出进行随机化,尤其是在使用相同密码时。只需从一个好的随机源生成一个随机盐,并按原样存储即可。当然,如果您使用经过身份验证的加密(AES-GCM或类似),那么您应该将salt作为额外的经过身份验证的数据传递,以便检测(恶意)操纵


有用资源:标签

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

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

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

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

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

是的,这很重要,但只是在一定程度上。如果输出很小,比如64位,那么查找冲突(某些输入散列到相同的输出)比查找128位输出的散列更容易。这就是为什么现在不应该使用短哈希函数。任何输出256位的都可以。请注意,SHA-512的实现可以使其在SHA-256支持的64位平台上运行得更快

长一点的盐能给我额外的安全感吗

不,salt用于区分同一密码或密钥的多次使用。使用相同的salt将使窃取密码数据库的攻击者能够同时而不是一个接一个地强制执行所有用户的密码。拥有64位或128位salt足以防止彩虹表的生成(但大的迭代次数基本上解决了这一问题)

有一点盐是唯一相关的