security - 公开的散列可以被认为是安全的多长时间?

标签 security hash sha

如果我在我的网站上留下一个 SHA2 家族哈希 - 它会被认为是安全的多长时间?在我确定有人会为它找到碰撞并知道散列的内容之前,我需要多长时间?

我知道时间的长短取决于试图打破它的人的计算能力。它还取决于字符串长度,但我很好奇哈希的安全性。

由于我们中的许多人都运行网络服务器,因此我们必须不断为有人可能一路访问存储用户哈希的数据库做好准备。那么,将服务器安全性排除在外,然后你有什么?

对于与我交谈过的许多人来说,这是一个略显理论的领域,因此我很想获得更多关于平均预期破解的信息。

hash('sha256', 'mytext');
hash('sha256', 'thisismytext');
hash('sha256', 'xx$1sw@the4e');
hash('sha256', 'thisismyslightlylongertext');

db695168e73ae294e9c4ea90ff593e211aa1b5693f49303a426148433400d23f
b62c6ac579abf8a29e71d98aeba1447c66c69002cfd847b148584f886fd297ef
501f1b26abbc75594d06f0935c8bc502d7bcccf5015227bd6ac95041770acb24
3debc12761bbeb5b4460978ac2be5b104163de02ea799f0705399d0e5b706334

最佳答案

首先,您不是在谈论碰撞。冲突是当有人发现散列为相同值的两条不同的消息时。在这里,您不必担心有人会找到与您发布的值相匹配的另一个输入;确实,您害怕有人发现您的意见。正确的术语是 原像攻击 .有时,我们说攻击者试图“反转”散列函数(找到与给定输出匹配的输入)。

有两种方法可以尝试为给定的散列值找到原像:利用散列函数的弱点,或者通过尝试候选来猜测输入。

SHA-2 在原像抗性方面没有已知的弱点。说到这一点,MD5 甚至 MD4 都没有已知的弱点,尽管从密码学的角度来说,这两个功能被认为是完全被破坏的。因此,除非哈希函数的科学研究取得巨大进步,否则很可能无法通过哈希函数密码弱点找到您的哈希值。

尝试候选者可能或不可能,取决于攻击者对输入的了解。这很难准确建模。例如,假设输入是一个包含七个字母的单词。有 267 = 8031810176 个这样的词。使用 SHA-256 尝试所有这些,将每次与您的哈希值进行比较,在最近的 PC 上花费几分钟时间,实现方式很简单。

在更一般的基础上,探索可能的输入集称为 字典攻击 因为它通常用于恢复用户密码的问题:令人沮丧的是,用户缺乏想象力,并且经常从一组有限的“单词”中选择密码,而将这组单词称为“字典”似乎是合乎逻辑的。我们也称其为“蛮力”或“穷举搜索”。

假设字典足够小,攻击者可以真实地尝试所有单词,那么不仅你的哈希值最终会被反转(如果攻击者有足够的激励),而且这也为 开辟了道路。费用分摊 :攻击者可能会尝试在几种类似的攻击情况下共享他的计算工作(即多个要反转的哈希值,使用相同的哈希函数——这又是一个常见的密码相关攻击模型)。一种基本的成本分摊方法是制作 预计算表 :攻击者为他的字典计算一次所有的哈希值;然后,所有后续的哈希值都可以通过简单地在表中查找哈希值来攻击。查找速度非常快(攻击者按递增顺序对他的散列进行排序)。 Rainbow tables是一种预计算表,以一种允许紧凑表示的智能方式:它们使攻击者可以“保留”一个大的预计算表,而无需一卡车的硬盘。尽管如此,无论彩虹与否,表中的所有值(在彩虹表的情况下是压缩前的值)必须由某个地方的攻击者至少计算一次,即有人能够进行完整的字典攻击。这有两个成本:CPU 成本(用于计算所有散列)和存储成本(用于存储散列值)。彩虹表使存储更便宜,但不会改善 CPU 方面的情况。

Salting击败预先计算的表(包括彩虹表)。它使小词典更容易被接受。也就是说,如果我们假设反转一个哈希值是可行的,那么盐至少确保攻击者每次都必须支付字典攻击的全部 CPU 成本,并且他将无法共享他在多次攻击或与其他攻击者之间的成本。密码需要加盐,因为事实证明,总的来说,让普通用户从足够多的可能密码集中选择和记住密码是不可能的。

如果您的输入来自足够大的字典以击败单次蛮力操作,那仍然会好得多。重要的是输入字符串可能采用的值集的大小;必须根据攻击者对被攻击数据的了解来估计该集合。例如,如果攻击者试图找到用户密码,那么他知道输入字符串很短(用户没有耐心)并且只包含可以在键盘上输入(盲目!)的字符;而且他也知道序列是可以内存的,这使得诸如“.%f*(.ds/~\d09j@”之类的东西不太可能。输入大小本身没有限制;我们说彩虹表是有限的改为“15 个字符左右”,因为接受输入超过 15 个字符的用户也会从太大的集合中选择密码,以允许进行表构建所需的单次蛮力工作。请注意,尝试所有 15 个字符的序列已经是一种方式很多(即使是所有 15 个小写字母的序列也意味着超过 270 次哈希计算,这在今天的技术中并不可行)。

关于security - 公开的散列可以被认为是安全的多长时间?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4687518/

相关文章:

asp.net - 跨两个命名域共享 session cookie

security - 安全客户端-服务器 Phonegap 应用程序的架构

perl - 如何在不使用临时数组的情况下访问最后一个 Perl 哈希键?

c# - 是否可以在 C# 中处理单个位?尝试实现 SHA256 生成器

security - 更改圆 table 中的哈希函数值

asp.net - 恶意用户可以修改 View 状态吗?

java - 为什么 Java 7 为签名的应用程序请求网络权限?

python - Python3 hashlib 和 Google BigQuery 的 MD5 哈希输出的差异

c++ - uuid_t 的现有哈希函数

c++ - 如何计算具有相同 SHA-160 总和的另一个位模式?