网络应用程序的密码:bcrypt和SHA256(和scrypt)(Web app passwords

2019-06-25 09:05发布

与所有的最近的(如LinkedIn)密码的讨论,我期待在密码哈希实现。 咖啡和早读两杯后,我不再是一个译电员比当我开始。 我真的不想假装我。

具体问题

  1. 不使用整数唯一的用户ID失败作为有效盐? (隐窝()仅使用16位?)

  2. 如果我只是直到第二用完这是否战胜蛮力攻击反复执行SHA256()上的哈希?

  3. 如果我要问这些问题我应该使用bcrypt?

讨论/说明:

我们的目标是简单的,如果我的用户的哈希密码被泄露他们:

  1. 不会是“容易”破解,
  2. 破解一个密码不会暴露在使用相同密码的其他用户)。

我读过的#1是哈希计算一定是昂贵的 - 回吐,说,一两秒钟来计算,也许需要一点或内存(以挫败硬件解密)。

bcrypt有这种内置的,和scrypt,如果我理解正确的话,更多的是面向未来的,包括最小的内存使用需求。

但是,这是一个同样有效的方法吃的“老调重弹” SHA256的结果时间()作为​​根据需要多次使用了几秒钟,然后存储最终循环计数与哈希后检查提供的密码?

#2,使用每个密码独特的盐是很重要的。 什么是没有明确是盐必须如何随机的(或大)会。 如果目标是避免大家使用“输入mypassword”作为自己的密码从具有相同散列是不够的,只是做到这一点?:

hash = sha256_hex( unique_user_id + user_supplied_password );

甚至这一点,虽然我不知道它给我买了什么:

hash = sha256_hex( sha256( unique_user_id ) + user_supplied_password );

唯一的好处,我可以从使用用户的ID看,除了我知道它是独一无二的,是避免其沿保存盐与哈希值。 没有太多的优势。 是否有使用用户的ID作为盐真正的问题? 这岂不是完成#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_wide_string”和使用,运行他们的字典攻击的时候,对不对?

是否有一个很好的理由在我自己的滚动如上所述使用bcrypt? 也许是事实,我问这些问题是有足够的理由?

顺便说一句 - 我只是计时现有的哈希函数我已经和我的笔记本电脑,我可以产生约7000哈希第二。 这并不是说经常建议颇有一两秒钟。

一些相关链接:

使用SHA256散列(hashing),并与用户的ID盐析

SHA512与Blowfish和Bcrypt

什么是用户密码盐的最佳长度?

Answer 1:

Bcrypt是伟大的,因为你可以调整,从4到31的工作因素,每个增量创建exponentional所需的时间,其实我已经绘制它,在它已经接管第二的14工作因子,使计算机变得越来越快你只需要改变一个参数,当然更新您的密码哈希...

我与bcrypt主要担心的是,如果工作因子设置为高,那么它可能过载系统为多个用户尝试登录,所以你必须调整它,这取决于并发登录的数量和您的系统资源。 ..

盐仍然需要,他们的主要目的是阻止脱线的攻击,如果盐的空间是很大,那么对手就无法生成查找表,64位盐似乎有点低,bcrypt有128个再加上工作因数位盐使得它相当大的挑战为脱机攻击......是的盐应该是随机的每一个密码,bcrypt将产生一个给你,如果你使用相同的盐每个密码,然后你让eassier使用的网络攻击对手来comprimised所有密码。

Bcrypt真正的亮点在网上的攻击,如果你已经设定了正确的工作因素,因为即使我得到的哈希值,意思是说如果“对手”获得哈希,工作因素使得它可以很痛苦的经历整个词典,服用多天,如果密码不是在字典中,那么我真的有麻烦了导致暴力攻击将是史诗般的,对于bcrypt密码位的空间是有限的,虽然:)相当大

SHA256可服用一点的时间了,但最终的计算机将变得越来越快,这将是相当容易的攻击,UNIX人认为隐窝是这么慢呢从来没有成为一个问题,今天我做了一个在几秒钟内网上的攻击,在天脱机攻击,蛮力攻击中周(整个密码位空间去)...

  1. 你想要的盐是作为大和随机尽可能仅使用数字使得它更容易为我在遍历所有可能的ID。
  2. 多SHA256可能需要第二次,但现在的道路也不会是有效的更多,计算机处理能力呈指数级增长,所以你想要一个可以被配置为这样的算法。
  3. 你通过提问和做功课,如果更多的人这样做,我们不会有这么多的漏洞做正确的事


Answer 2:

不使用整数唯一的用户ID失败作为有效盐? (隐窝()仅使用16位?)

您通常会使用一个随机生成的盐,然后存储的散列与加密密码一起。 不要紧,攻击者也能存取盐 - 它的目的是为了防止使用的查找表,从而迫使攻击者蛮力每个哈希独立。

crypt只是存储盐和散列成一个单一的字符串,用algoritm使用沿。



文章来源: Web app passwords: bcrypt and SHA256 (and scrypt)