Hash 要用多长时间的时间来暴力处理一份腌制的SHA-512杂烩?(提供食盐)

Hash 要用多长时间的时间来暴力处理一份腌制的SHA-512杂烩?(提供食盐),hash,cryptography,salt,brute-force,sha,Hash,Cryptography,Salt,Brute Force,Sha,以下是Java中的一个算法: public String getHash(String password, String salt) throws Exception { String input = password + salt; MessageDigest md = MessageDigest.getInstance(SHA-512); byte[] out = md.digest(input.getBytes()); return HexEncoder.t

以下是Java中的一个算法:

public String getHash(String password, String salt) throws Exception {
    String input = password + salt;
    MessageDigest md = MessageDigest.getInstance(SHA-512);
    byte[] out = md.digest(input.getBytes());
    return HexEncoder.toHex(out);
}

假设盐是已知的。我想知道,当密码是一个字典单词时,以及当它不是一个字典单词时,是什么时候使用暴力的。

这个问题没有一个单一的答案,因为变量太多,但SHA2还没有真正破解(请参见:),所以它仍然是一个用于存储密码的好算法。盐的使用是很好的,因为它可以防止来自彩虹桌或彩虹桌的攻击。salt的重要性在于它对于每个密码都应该是唯一的。存储散列密码时,可以使用[128位salt][512位密码散列]等格式

唯一可行的攻击方法是实际计算不同密码可能性的哈希值,并通过匹配哈希值最终找到正确的密码

为了说明一秒钟内可以进行多少次哈希运算,我认为比特币就是一个不错的例子。使用SHA256,简而言之,生成的哈希越多,获得的比特币就越多(可以用比特币兑换真正的货币),因此人们会出于这个目的使用GPU。您可以看到,一张平均价格仅为150美元的图形卡可以计算超过2亿次哈希/秒。密码越长越复杂,所需时间就越长。以200米/秒的速度计算,尝试8个字符的字母数字(大写,小写,数字)的所有可能性大约需要300小时。如果密码是符合条件的或普通英语单词,则实时性很可能会降低

因此,您需要在上下文中查看任何安全性。攻击者的动机是什么?什么样的应用程序?为每一个添加随机盐的散列可以很好地防止数千个密码被泄露的情况


您可以做的一件事是通过减慢散列过程来添加额外的暴力保护。由于您只对密码进行一次哈希运算,而攻击者必须多次进行哈希运算,因此这对您有利。典型的方法是获取一个值,对其进行散列,获取输出,再次对其进行散列,以此类推,进行固定数量的迭代。例如,您可以尝试1000或10000次迭代。这将使攻击者查找每个密码的速度慢很多倍。

在您的情况下,破坏哈希算法相当于在哈希算法中查找冲突。这意味着您不需要查找密码本身(这将是一个),只需要查找哈希函数的输出,该输出等于有效密码的哈希值(因此为“冲突”)。使用a查找冲突需要O(2^(n/2))时间,其中n是哈希函数的输出长度(以位为单位)

SHA-2的输出大小为512位,因此查找冲突将花费O(2^256)时间。鉴于没有对算法本身的巧妙攻击(目前SHA-2哈希家族中没有已知的攻击),这就是破坏算法所需要的

了解2^256的实际含义:目前人们认为(整个!!!)宇宙中的原子数大约为10^80,也就是2^266。假设输入为32字节(这对于您的情况是合理的-20字节salt+12字节密码),我的机器需要~0,22s(~2^-2s)来进行65536(=2^16)计算。因此,2^256次计算将在2^240*2^16次计算中完成,这将需要

2^240 * 2^-2 = 2^238 ~ 10^72s ~ 3,17 * 10^64 years
甚至称之为数百万年也是荒谬的。而且,在这个星球上速度最快的硬件并行计算数千个哈希值的情况下,它也不会变得更好。没有任何人类技术能够把这个数字压缩成可以接受的数字

所以忘了在这里强迫SHA-256吧。你的下一个问题是关于字典里的单词。传统上使用密码来检索这种弱密码。彩虹表通常只是一个预计算哈希值的表,其思想是,如果您能够预计算并存储每个可能的哈希值及其输入,那么您需要O(1)来查找给定的哈希值并为其检索有效的前映像。当然,这在实践中是不可能的,因为没有存储设备可以存储如此大量的数据。这种困境被称为。由于您只能存储如此多的值,典型的rainbow表包括某种形式的哈希链和中间缩减函数(这在Wikipedia文章中有详细解释),通过省去一点时间节省空间

盐是使这种彩虹表不可行的对策。为了阻止攻击者预先计算特定salt的表,建议应用每个用户的salt值。然而,由于用户不使用安全的、完全随机的密码,如果salt是已知的,而您只是在一个简单的试错方案中迭代一个大型通用密码字典,那么您会获得多么大的成功,这仍然令人惊讶。自然语言和随机性之间的关系表示为。典型的密码选择通常是低熵的,而完全随机的值将包含最大熵

典型密码的低熵使得您的一个用户使用来自相对较小的常用密码数据库的密码的可能性相对较高。如果你用谷歌搜索它们,你最终会找到这些密码数据库的torrent链接,通常是千兆字节大小的。如果攻击者没有受到任何限制,使用此类工具的成功时间通常在几分钟到几天之间

这就是为什么通常仅使用散列和盐析是不够的,您还需要安装其他安全机制。您应该使用一种人为减慢的熵产生方法,如中所述的PBKDF2,并且您应该在给定用户重试输入密码之前对其强制执行一段等待时间。一个好的方案是从0.5s开始,然后每次失败的尝试都将该时间加倍。在大多数情况下,我们
1 minute:    3.2
5 minute:    3.6
30 minutes:  4.1
2 hours:     4.4
3 days:      5.2