【问题标题】:Is it possible to reverse a SHA-1?是否可以反转 SHA-1?
【发布时间】:2010-02-10 07:22:20
【问题描述】:

是否可以反转 SHA-1?

我正在考虑使用 SHA-1 创建一个简单的轻量级系统来验证通过未加密连接进行通信的小型嵌入式系统。

假设我使用来自“密钥”的输入创建了一个像这样的 sha1,并使用时间戳来添加它,这样 SHA-1 就会一直变化。

sha1("My Secret Key"+"a timestamp")

然后我将这个 SHA-1 包含在通信和服务器中,它可以进行相同的计算。并且希望没有人能够弄清楚“密钥”。

但这真的是真的吗?

如果您知道我是这样做的,您就会知道我确实在其中放置了一个时间戳,并且您会看到 SHA-1。 然后你能用这两个找出“秘钥”吗?

secret_key = bruteforce_sha1(sha1, timestamp)

注意1: 我想你可以通过某种方式进行暴力破解,但这实际上需要做多少工作?

注2: 我不打算加密任何数据,我只想知道是谁发送的。

【问题讨论】:

  • 类似于翻转馅饼。即使你知道面包师在里面放了多少鸡蛋,你能做的最好的就是尝试烤出完全相同的馅饼:)。
  • 加密系统几乎总是被错误地实现。 / 如果可能的纯文本空间足够小,那么遍历所有合理的组合是可行的。几年前,在一个单核工作站上,我用大约一个小时的蛮力(使用一个简单的 Java 程序)运行了价值 32 位的 MD5。
  • 你怎么知道服务器和客户端的时间完全相同,所以服务器可以重现客户端创建的哈希?
  • @Karsten:客户端时间戳需要作为消息的一部分进行传输
  • 两者都可能使用某种时间同步,如 ntp。

标签: security sha1


【解决方案1】:

不,你不能反转 SHA-1,这正是它被称为安全哈希算法的原因。

您绝对应该做的是将正在传输的消息包含在哈希计算中。否则,中间人可以截获消息,并使用签名(仅包含发送者的密钥和时间戳)将其附加到假消息(它仍然有效)。

而且您现在可能应该将 SHA-256 用于新系统。

sha("My Secret Key"+"a timestamp" + the whole message to be signed)

您还需要另外以明文形式传输时间戳,否则您将无法验证摘要(除了尝试大量合理的时间戳)。

暴力攻击是否可行取决于您的密钥的长度。

整个系统的安全性将依赖于这个共享的秘密(因为发送者和接收者都需要知道,但没有其他人知道)。攻击者会尝试获取密钥(通过暴力猜测或尝试从您的设备中获取),而不是尝试破坏 SHA-1。

【讨论】:

  • 您绝对可以找到 SHA-1 的冲突,但这不是一个很快的过程。
  • 而不是像这样散列,您应该使用为此目的而编写的 HMAC,并防止上述方法容易受到的各种攻击。好吧,如果你是美国国家安全局或中国,那就很容易受到攻击。
  • 我有一个更小的嵌入式系统,所以让我们看看资源能走多远:)
  • 您必须将时间戳和消息连同哈希一起发送,您将面临扩展攻击和时间戳冲突等风险。
  • +1 以获得好的答案。拥有一个好的共享秘密是一个有趣的问题,Diffie-Hellman 是一个很好的解决方案。 @Piskvor 找到 sha1 的碰撞与反转它不一样!!!
【解决方案2】:

SHA-1 是一个hash function,旨在使逆转操作变得非常困难。因此,此类哈希函数通常称为one-way functionscryptographic hash functions

但是,SHA-1 的抗碰撞性为theoretically broken in 2005。这允许以 50% 的概率找到两个具有相同哈希值的不同输入,这比具有 280 成本的通用生日攻击更快。 2017 年,碰撞攻击变得可行,称为shattered

As of 2015, NIST dropped SHA-1 for signatures。您应该考虑为新应用程序使用更强大的东西,例如 SHA-256

Jon Callas 在 SHA-1 上:

是时候步行而不是奔跑到消防出口了。你看不到烟雾,但火警已经响了。

【讨论】:

  • 很好,你警告,但它是否回答了这个问题?
  • “几乎难以逆转”似乎回答了这个问题。
  • 很好的 sha1 信息,但没有真正回答我的问题。
【解决方案3】:

问题是实际上如何通过不安全的会话进行身份验证。

这样做的标准是使用消息摘要,例如HMAC

您发送消息明文以及该消息的随附哈希,其中您的秘密已混入。

所以不是你的:

sha1("My Secret Key"+"a timestamp")

你有:

msg,hmac("My Secret Key",sha(msg+msg_sequence_id))

消息序列 ID 是一个简单的计数器,用于让双方跟踪他们在此“会话”中交换的消息数量 - 这可以防止攻击者简单地重播以前看到的消息。

这是验证消息的行业标准和安全方式,无论消息是否加密。


(这就是为什么你不能暴力破解哈希:)

哈希是一种单向函数,这意味着许多输入都产生相同的输出。

您知道其中的秘密,并且可以对时间戳的范围做出合理的猜测,然后您可以遍历所有这些时间戳,计算哈希值并进行比较。

当然,您检查的范围内的两个或多个时间戳可能会“冲突”,即虽然时间戳不同,但它们会生成相同的哈希。

因此,从根本上说,没有任何方法可以确定地反转散列。

【讨论】:

  • @Johan “相当安全”是相当低调的。 “安全”更准确。
【解决方案4】:

在数学术语中,只有bijective functions 具有反函数。但是哈希函数不是injective,因为有多个输入值会导致相同的输出值(冲突)。

所以,不,散列函数不能反转。但是你可以寻找这样的碰撞。


编辑

由于您想验证系统之间的通信,我建议使用HMAC。这种计算消息验证码的结构可以使用不同的散列函数。您可以使用 SHA-1、SHA-256 或任何您想要的哈希函数。

为了验证对特定请求的响应,我会发送一个nonce 以及需要用作盐来验证响应的请求。

【讨论】:

  • 我觉得它不是很有说服力,想看看马克的答案在上面(当时,他们俩的分数一样)。仅仅说只有双射函数可以反转在这里并不是很有帮助。对于计算 x mod 4,您可以说同样的话。不是双射的,但也不安全。
【解决方案5】:

您不能反转 SHA-1 加密字符串并不完全正确。

你不能直接反转一个,但可以用彩虹表来完成。

维基百科: 彩虹表是用于反转加密哈希函数的预计算表,通常用于破解密码哈希。表通常用于恢复由一组有限字符组成的特定长度的明文密码。

本质上,SHA-1 的安全性取决于所用密码的强度。如果用户的密码很长且字符组合模糊,现有的彩虹表不太可能有加密字符串的密钥。

您可以在此处测试加密的 SHA-1 字符串: http://sha1.gromweb.com/

您可以使用互联网上的其他彩虹表,以便 Google 反向 SHA1。

【讨论】:

  • 这是一个非常有趣的网站。我尝试了一些来自我正在进行的开发项目的示例。第一个是“admin”的 SHA1,然后反转为“Adminadmin”,然后我使用了“Alan”,它反转为“Alanalan”(目前在最新列表中)。知道为什么字符串会这样重复吗?
  • @ AlanObject艾伦是93a6742abd1bcf98fcbad51928ab772702fb0998,Alanalan是be9c46a76a6b42899db23c692f36746e5c62bf4b,admin是d033e22ae348aeb5660fc2140aec35850c4da997和为adminadmin是2b9498d58ca0101d310357134a82b0dffb079606。这些都是不同的值。
【解决方案6】:

请注意,针对 MD5 和 SHA-1 的最佳攻击是找到任意两个任意消息 m1 和 m2,其中 h(m1) = h(m2) 或找到 m2 使得 h(m1) = h(m2) 和m1 != m2。在给定 h(m1) 的情况下找到 m1 在计算上仍然是不可行的。

此外,您使用的是 MAC(消息验证码),因此攻击者不能在不知道秘密的情况下忘记消息,但需要注意的是 - 您使用的一般 MAC 结构容易受到长度扩展攻击 - 攻击者可以在在某些情况下,在给定 m2, h(secret, m2) 的情况下伪造消息 m2|m3, h(secret, m2|m3)。这不仅仅是时间戳的问题,而是当您在任意长度的消息上计算 MAC 时会出现问题。您可以将秘密附加到时间戳而不是预先等待,但一般情况下,您最好将 HMAC 与 SHA1 摘要一起使用(HMAC 只是一种构造,可以使用 MD5 或 SHA 作为摘要算法)。

最后,您只是签署了时间戳,而不是完整的请求。活跃的攻击者可以轻松地攻击系统,尤其是在您没有重放保护的情况下(尽管即使有重放保护,这个缺陷也存在)。例如,我可以从一条消息中捕获时间戳、HMAC(timestamp with secret),然后在我自己的消息中使用它,服务器会接受它。

最好发送消息,HMAC(消息)具有足够长的秘密。服务器可以保证消息的完整性和客户端的真实性。

您可以根据您的威胁场景添加重播保护或注意没有必要,因为消息在全部重播时不会导致任何问题。

【讨论】:

    【解决方案7】:

    散列依赖于输入,对于相同的输入将给出相同的输出。

    所以,除了其他答案,请记住以下几点:

    如果以密码开始哈希,可以预先计算彩虹表,并快速添加合理的时间戳值,如果以时间戳开始,则要困难得多。

    所以,而不是使用 sha1("我的秘钥"+"时间戳")

    去 sha1("时间戳"+"我的密钥")

    【讨论】:

    • 不,盐和数据的顺序与安全哈希的可预测性无关(初始化向量和明文的顺序对于可逆加密非常重要)
    【解决方案8】:

    我相信接受的答案是技术上正确但错误,因为它适用于用例:通过公共/不可信媒体创建和传输防篡改数据。

    因为虽然技术上很难暴力破解或反转 SHA 哈希,但当您通过 Internet 发送纯文本“数据和数据的哈希 + 机密”时,如如上所述,在捕获足够的数据样本后,可以智能地获取秘密。想一想 - 您的数据可能会发生变化,但密钥保持不变。所以每次你发送一个新的数据块,它都是一个运行基本破解算法的新样本。使用 2 个或更多包含不同数据和数据+秘密的哈希的样本,您可以验证您确定的秘密是正确的,而不是误报。

    这种情况类似于 Wifi 破解者在捕获足够的数据包后如何破解 wifi 密码。在您收集到足够的数据后,生成密钥就很简单了,即使您在技术上并未反转 SHA1 甚至 SHA256。确保您的数据未被篡改或验证您在另一端与谁交谈的唯一方法是使用 GPG 等(公钥和私钥)加密整个数据块。当您正在散列的数据可见时,散列本质上总是不安全的。

    实际上,这实际上取决于您首先进行散列的应用程序和目的。如果所需的安全级别是微不足道的,或者说你在一个 100% 完全受信任的网络中,那么散列可能是一个可行的选择。希望网络上没有人或任何入侵者对您的数据感兴趣。否则,据我目前可以确定,唯一可靠可行的选择是基于密钥的加密。您可以加密整个数据块,也可以只对其进行签名。

    注意:这是英国人在二战期间能够破解 Enigma 密码的方式之一,从而有利于盟军。

    对此有什么想法吗?

    【讨论】:

      【解决方案9】:

      SHA1 旨在防止从哈希中恢复原始文本。但是,SHA1 databases exists 允许通过其 SHA 哈希查找常用密码。

      【讨论】:

        【解决方案10】:

        是否可以反转 SHA-1?

        SHA-1 旨在成为一种抗冲突哈希,其目的是使查找具有相同哈希的不同消息变得困难。它还被设计为具有抗原像,即很难找到具有规定哈希的消息,以及抗第二原像,因此它是很难找到与规定消息具有相同哈希值的第二条消息。

        SHA-1 的抗碰撞性在2017 by Google's teamNIST already removed the SHA-1 for signature purposes in 2015 中几乎被破坏。

        另一方面,SHA-1 原像抗性仍然存在。应该注意原像电阻if the input space is short, then finding the pre-image is easy。因此,您的密钥至少应为 128 位。

        SHA-1("我的密钥"+"时间戳")

        这是前缀秘密结构,在基于 Merkle-Damgard 的哈希函数(如 SHA-1)上具有称为 length extension attack 的攻击案例。 Applied to the Flicker。不应将其与 SHA-1 或 SHA-2 一起使用。可以使用

        • HMAC-SHA-256(HMAC 不需要哈希函数的抗碰撞性,因此 SHA-1 和 MD5 对于 HMAC 来说仍然可以,但是,忘记了它们)以实现更好的安全系统。 HMAC 具有双重调用哈希函数的成本。这是时间要求系统的弱点。一张纸条; HMAC 是密码学中的野兽。

        • KMAC 是 SHA-3 的前缀秘密结构,由于 SHA-3 可以抵抗长度扩展攻击,所以这是安全的。

        • 使用带有前缀结构的BLAKE2,这也是安全的,因为它还可以抵抗长度扩展攻击。 BLAKE 是一个非常快速的哈希函数,现在它也有一个并行版本 BLAKE3(需要一些时间进行安全分析)。 Wireguard 使用 BLAKE2 作为 MAC。

        然后我将这个 SHA-1 包含在通信和服务器中,它可以进行相同的计算。并且希望没有人能够弄清楚“密钥”。

        但这真的是真的吗?

        如果您知道我是这样做的,您就会知道我确实在其中放置了一个时间戳,并且您会看到 SHA-1。然后你能用这两个找出“秘钥”吗?

        secret_key = bruteforce_sha1(sha1, 时间戳)

        您没有定义密钥的大小。如果您的攻击者知道时间戳,那么他们会尝试通过搜索来查找它。如果我们考虑比特币矿工的集体力量,截至 2022 年,they reach around ~293 SHA-256 在一年内翻了一番。因此,您必须根据您的风险调整您的安全性。截至 2022 年,NIST 的最低安全性为 112 位。应该考虑上述 128 位的秘密大小。

        注意 1:我猜你可以通过某种方式进行暴力破解,但这实际上需要做多少工作?

        鉴于上面的答案。作为一种特殊情况,针对Grover's algorithm(一种用于查找前图像的 Quantum 算法)的可能实现,应该使用大于 256 输出大小的散列函数。

        注意2:我不打算加密任何数据,我只是想知道是谁发送的。

        这不是办法。只有当秘密像 DHKE 一样相互共享时,您的构造才能工作。这是只有发件人和您才知道的秘密。除了管理这个问题,更好的方法是使用数字签名来解决这个问题。此外,一个人也将获得不可否认性。

        【讨论】:

          猜你喜欢
          • 2011-01-15
          • 1970-01-01
          • 2010-11-06
          • 1970-01-01
          • 2020-09-16
          • 2017-03-10
          • 2015-01-19
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多