Encryption Web应用程序密码:bcrypt和SHA256(和scrypt)
在最近(例如LinkedIn)关于密码的讨论中,我正在研究密码哈希实现。喝了两杯咖啡,早上读了一篇文章,我和刚开始读的时候一样,不再是一个密码学家了。我真的不想假装我是 具体问题Encryption Web应用程序密码:bcrypt和SHA256(和scrypt),encryption,passwords,hash,salt,bcrypt,Encryption,Passwords,Hash,Salt,Bcrypt,在最近(例如LinkedIn)关于密码的讨论中,我正在研究密码哈希实现。喝了两杯咖啡,早上读了一篇文章,我和刚开始读的时候一样,不再是一个密码学家了。我真的不想假装我是 具体问题 使用整数唯一用户ID作为有效salt是否失败?(crypt()仅使用16位? 如果我只是在一个散列上反复运行sha256(),直到一秒钟用完为止,这是否能击败暴力攻击? 如果我必须问这些问题,我应该使用bcrypt吗? 讨论/解释: 目标很简单,如果我的用户的散列密码被泄露,他们: 不是"容易"破解的, 破解一个密码不
hash = sha256_hex( unique_user_id + user_supplied_password );
甚至这个,尽管我不确定它能给我带来什么:
hash = sha256_hex( sha256( unique_user_id ) + user_supplied_password );
我从使用用户ID中看到的唯一好处,除了我知道它是唯一的之外,就是避免了将盐和散列一起保存。没什么优势。使用用户ID作为salt是否真的有问题?这难道不能实现#2吗
我假设如果有人可以窃取我用户的散列密码,那么我必须假设他们可以得到他们想要的任何东西——包括生成散列的源代码。那么,在散列之前向密码添加额外的随机字符串(相同的字符串)有什么好处吗?即:
# app_wide_string = one-time generated, random 64 7-bit *character* string.
hash = sha256_hex( unique_user_id + app_wide_string + user_supplied_password );
我已经看到了这一建议,但我不明白我从中得到了什么。如果有人想暴力攻击,他们会知道“app\u wide\u string”并在运行字典攻击时使用它,对吗
如上所述,是否有充分的理由使用bcrypt覆盖我自己的?也许我问这些问题就足够了
顺便说一句——我刚刚对笔记本电脑上现有的散列函数进行了计时,每秒可以生成大约7000个散列。不完全是人们常说的一两秒钟
一些相关链接:
Bcrypt非常好,因为你可以将功因数从4调整到31,每个增量都会产生一个指数级的所需时间,我已经用图表表示了,功因数为14时,它已经占用了一秒钟多的时间,所以随着计算机越来越快,你只需要更改一个参数,当然还需要更新密码哈希 我对bcrypt的主要担忧是,如果工时系数设置为高,那么可能会导致系统过载,因为多个用户正在尝试登录,因此您需要根据并发登录的数量和系统的资源对其进行调整 仍然需要salt,它们的主要目的是阻止离线攻击,如果salt空间太大,那么对手将无法生成查找表,64位salt似乎有点低,bcrypt有128位salt,再加上功因子,这对离线攻击来说是一个相当大的挑战。。。是的,每个密码的salt应该是随机的,bcrypt将为您生成一个,如果您对每个密码使用相同的salt,那么您就使得对手更容易使用在线攻击来压缩所有密码 如果你正确设置了功因子,那么Bcrypt在网络攻击方面确实很出色,因为即使我得到了哈希值,也就是说如果“对手”得到了哈希值,功因子也会让你很痛苦地翻阅整个字典,需要几天的时间,如果字典中没有密码,然后我真的遇到了麻烦,因为暴力攻击将是史诗般的,bcrypt的密码位空间非常大,但有限:) Sha256现在可能需要一点时间,但最终计算机会越来越快,攻击也会越来越容易,unix的家伙们认为crypt太慢了,根本不会成为问题,今天我在几秒钟内完成了一次在线攻击,几天内完成了离线攻击,一次蛮力攻击(查看整个密码位空间)几周后
crypt
只需将salt和hash存储到一个字符串中,以及要使用的算法。谢谢。还有