我们想在我们的数据库中以加密方式(SHA-256)散列一个秘密值。由于我们希望将此作为查询数据库中单个记录的方法,因此我们不能为每个加密值使用不同的随机盐。
我的问题是:无限制地访问我们的数据库,并且鉴于攻击者至少知道一个秘密值和散列值对,攻击者是否可以对加密密钥进行反向工程? IE,那么攻击者是否能够反转所有哈希并确定所有秘密值?
如果是这种情况,似乎这会破坏加密哈希的整个目的,所以也许我错过了一些东西。
答案 0 :(得分:6)
没有发布针对SHA-256的“第一次预映像”攻击。如果没有这样的攻击来打开快捷方式,攻击者就无法从SHA-256哈希中恢复秘密值。
但是,提到“秘密密钥”可能表明存在对哈希的一些混淆。散列算法不使用密钥。因此,如果攻击者能够攻击一个“秘密值 - 哈希值”对,他就不会学习一个能够轻松反转其余哈希值的“密钥”。
当哈希被成功攻击时,通常是因为原始邮件来自一个小空间。例如,大多数密码是从相对较短的真实单词列表中选择的,可能具有一些简单的排列。因此,攻击者不是系统地测试每个可能的密码,而是从几十亿个最常用密码的有序列表开始。为避免这种情况,从大空间中随机选择“秘密值”非常重要。
有一些消息验证算法可以将密钥与一些数据一起散列。这些算法用于保护消息的完整性以防止篡改。但它们无助于阻止前映像攻击。
答案 1 :(得分:4)
简而言之,yes。
答案 2 :(得分:1)
不,SHA哈希是不可逆的(至少不容易)。如果你需要反转它,你需要重建哈希值。这通常使用私有(盐)和公钥来完成。
例如,如果我试图根据我的用户ID阻止访问。我会哈希我的用户ID和盐。以MD5为例。我的用户ID是“12345”,盐是“abcde”
所以我将散列字符串“12345_abcde”,返回“7b322f78afeeb81ad92873b776558368”的散列
现在我将传递给验证应用程序哈希和公钥,“12345”,这是公钥和has。
验证应用程序知道salt,因此它具有相同的值。 “12345_abcde”,反过来会生成完全相同的哈希值。然后我将我验证的哈希值与传递的哈希值进行比较,然后匹配。如果我以某种方式修改了公钥而没有修改哈希,那么就会生成一个不同的公钥,从而导致不匹配。
答案 3 :(得分:0)
是的,这是可能的,但不是在这一生中。
答案 4 :(得分:0)
使用多个GPU的现代暴力攻击可以在短时间内解决这个问题。我建议您遵循此应用程序的密码存储准则。这是the current password storage guidelines from OWASP。目前,他们建议使用长盐值,并且PBKDF2需要64,000次迭代,这会迭代地拉伸键并使计算复杂,以强制输入值。请注意,这也会使您生成密钥值的计算变得复杂,但您的想法是,您生成密钥的频率远低于攻击者所需的频率。也就是说,您的设计需要比典型的密码存储/挑战应用程序更多的关键派生,因此您的设计可能存在致命缺陷。还要记住,迭代计数应该每18个月翻一番,以使计算复杂度遵循摩尔定律。这意味着您的系统需要某种方式允许您重新散列这些值(可能通过组合散列技术)。随着时间的推移,您会发现密码分析师破坏了旧的HMAC功能,您需要准备好更新算法。例如,MD5或SHA-1的单次迭代曾经足够,但现在已经不够了。还有其他HMAC功能也可以满足您的需求,不需要PBKDF2(例如bcrypt或scrypt),但PBKDF2 目前是受到最严格审查的行业标准。有人可能认为bcrypt或scrypt也是合适的,但这也是为什么应该使用可插拔方案来允许你随着时间推移升级HMAC功能的另一个原因。