网络应用密码:bcrypt和SHA256(以及scrypt)

use*_*426 13 encryption passwords hash salt bcrypt

随着最近(例如LinkedIn)关于密码的讨论,我正在研究密码哈希实现.喝完两杯咖啡和早上读书后,我不再是一个密码学家了.我真的不想假装自己.

具体问题

  1. 使用整数唯一用户ID失败是否有效?(crypt()只使用16位?)

  2. 如果我只是一遍又一遍地在哈希上运行sha256(),直到一秒钟用完就能击败蛮力攻击?

  3. 如果我必须问这些问题我应该使用bcrypt吗?

讨论/说明:

目标很简单,如果我的用户的哈希密码被泄露了:

  1. 破解不会"容易"
  2. 破解一个密码不会暴露使用相同密码的其他用户).

我在#1中读到的是哈希计算必须是昂贵的 - 例如,计算一两秒或者可能需要一点或内存(以阻止硬件解密).

bcrypt有这个内置的,如果我理解正确的话,scrypt更具有前瞻性,并且包含最低内存使用要求.

但是,通过"重新散布"sha256()的结果,需要多次使用几秒钟,然后将最终循环计数与哈希值一起存储以便稍后检查提供的密码,这是一种同样有效的方法吗?

对于#2,为每个密码使用唯一的盐很重要.目前尚不清楚的是盐必须是随机的(或大的).如果目标是避免使用"mypassword"作为密码的每个人拥有相同的哈希,那么仅仅这样做是不够的?:

hash = sha256_hex( unique_user_id + user_supplied_password );
Run Code Online (Sandbox Code Playgroud)

甚至这个,虽然我不确定它会给我什么:

hash = sha256_hex( sha256( unique_user_id ) + user_supplied_password );
Run Code Online (Sandbox Code Playgroud)

使用用户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 );
Run Code Online (Sandbox Code Playgroud)

我已经看到了这个建议,但我不明白我从那个用户的盐中得到了什么.如果有人想强行攻击他们会知道"app_wide_string"并在运行他们的字典攻击时使用它,对吗?

如上所述,是否有充分的理由使用bcrypt滚动我自己?也许我问这些问题的理由足够了吗?

顺便说一句 - 我只是计算了我现有的散列函数和我的笔记本电脑,我每秒可以生成大约7000个哈希值.不太经常建议的一两秒钟.

一些相关链接:

使用sha256作为散列和使用用户ID进行腌制

SHA512与Blowfish和Bcrypt

用户密码盐的最佳长度是多少?

Sam*_*lar 8

Bcrypt很棒,因为你可以将工作因子从4调整到31,每个增量都会产生一个指数所需的时间,我实际上已经绘制了它,工作因子为14,它已经超过了一秒钟,因此计算机变得越来越快你只需要更改一个参数,当然更新你的密码哈希......

我对bcrypt的主要关注是,如果工作因子设置为高,那么当多个用户尝试登录时,它可能会使系统超载,因此您可以根据并发登录的数量和系统资源对其进行调整. ..

盐仍然是必需的,它们的主要目的是阻止离线攻击,如果盐空间很大,那么对手将无法生成查找表,64位盐似乎有点低,bcrypt有128位盐加上工作因素对离线攻击来说是一个很大的挑战......是的,每个密码的盐应该是随机的,bcrypt会为你生成一个,如果你为每个密码使用相同的盐,那么你已经成功了攻击者使用在线攻击来对所有密码进行压缩.

如果你已经正确设置了工作因素,Bcrypt真的很喜欢在线攻击,因为即使我得到哈希值,也就是说如果'对手'得到哈希值,那么工作因素会让整个词典变得非常痛苦,需要多天,如果密码不在字典中,那么我真的遇到麻烦导致暴力攻击将是史诗般的,bcrypt的密码位空间虽然有限但是相当大:)

Sha256现在可能需要一些时间,但最终计算机会变得越来越快,攻击起来相当容易,unix家伙认为地穴是如此之慢,以至于它永远不会成为一个问题,今天我做了一个几秒钟的在线攻击,几天的离线攻击,几周内的暴力攻击(通过整个密码位空间)......

  1. 你希望盐只使用数字尽可能大和随机,这使我更容易迭代所有可能的id.
  2. 多个sha256现在可能需要一秒钟但是在路上它将不再有效,计算机处理能力呈指数级增长,所以你想要一个可以这样配置的算法.
  3. 如果有更多的人这样做,我们会做出正确的事情,提出问题和做功课,我们就不会有这么多的违规行为