代码之家  ›  专栏  ›  技术社区  ›  Johan

是否可以反转sha1?

  •  37
  • Johan  · 技术社区  · 14 年前

    是否可以反转sha1?

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

    假设我使用“秘密密钥”的输入创建这样一个sha1,并用时间戳对其进行调味,这样sha将一直更改。

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

    然后我将这个sha1包含在通信和服务器中,这可以做同样的计算。希望没人能找出“秘密钥匙”。

    但这是真的吗?

    如果你知道我是这样做的,你就会知道我在里面放了一个时间戳,你会看到sha1。 然后你能用这两个找出“秘密钥匙”吗?

    secret_key = bruteforce_sha1(sha1, timestamp)
    

    谢谢 约翰


    注1 以下内容: 我想你在某种程度上可以蛮力,但那实际上需要多少工作?

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

    9 回复  |  直到 7 年前
        1
  •  39
  •   Thilo    14 年前

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

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

    现在您可能应该在新系统中使用SHA-256。

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

    您还需要在clear中额外传输时间戳,因为否则您将无法验证摘要(除了尝试大量合理的时间戳)。

    如果蛮力攻击是可行的,取决于你的密钥的长度。

    整个系统的安全性将依赖于这个共享的秘密(因为发送方和接收方都需要知道,但没有其他人知道)。攻击者会试图去寻找钥匙(要么是蛮力猜测,要么是试图从你的设备获取钥匙),而不是试图破坏sha-1。

        2
  •  24
  •   Mark Byers    14 年前

    SHA-1是一个 hash function 这样做的目的是使扭转操作变得不切实际。这种哈希函数通常被调用 one-way functions cryptographic hash functions 因为这个原因。

    不过,沙一号有一些 recently discovered weaknesses 这使得查找输入比对所有输入进行强力搜索更快。你应该考虑使用更强大的东西,比如 SHA-256 对于新应用程序。

    Jon Callas 关于SHA-1:

    该走了,但不要跑,到消防出口了。你看不到烟,但火警已经响了。

        3
  •  15
  •   Will    14 年前

    问题是 事实上 如何在不安全会话上进行身份验证。

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

    您发送消息的纯文本以及该消息的附带散列,其中您的秘密已经混合在其中。

    所以不是你的:

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

    你有:

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

    消息序列ID是一个简单的计数器,用于跟踪双方在此“会话”中交换的消息数,从而防止攻击者简单地重放以前看到的消息。

    这个 行业标准和安全 验证消息的方法,不管它们是否加密。


    (这就是为什么你不能粗暴地对待哈希:)

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

    正如您所知道的秘密,您可以对时间戳的范围进行合理的猜测,然后可以迭代所有这些时间戳,计算哈希并进行比较。

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

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

        4
  •  9
  •   Gumbo    14 年前

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

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


    编辑

    由于您想验证系统之间的通信,我建议使用 HMAC . 计算消息身份验证代码的构造可以使用不同的哈希函数。您可以使用sha-1、sha-256或任何您想要的哈希函数。

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

        5
  •  3
  •   Christian Findlay    7 年前

    不能反转sha-1加密字符串并不是完全正确的。

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

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

    从本质上讲,sha-1的安全性只相当于所用密码的强度。如果用户有长密码和模糊的字符组合,现有的彩虹表就不太可能有加密字符串的密钥。

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

    互联网上还有其他的彩虹表,你可以使用,所以谷歌反向sha1。

        6
  •  2
  •   mar    14 年前

    注意,对md5和sha-1的最佳攻击是找到任意两条消息m1和m2,其中h(m1)=h(m2),或者找到m2,这样h(m1)=h(m2)和m1!= m2。给定h(m1)的结果m1在计算上仍然不可行。

    另外,您使用的是MAC(消息身份验证代码),因此攻击者在不知道机密的情况下无法忘记消息,只需一个警告—您使用的一般MAC结构容易受到长度扩展攻击—在某些情况下,攻击者可以伪造给定m2、h(机密,m2 m3)的消息m2 m3、h(机密,m2 m3)。这不仅仅是时间戳的问题,而是在对任意长度的消息计算MAC时的问题。您可以将秘密附加到时间戳,而不是预先挂起,但一般来说,您最好使用带有sha1摘要的hmac(hmac只是构造,可以使用md5或sha作为摘要算法)。

    最后,您只需要签名时间戳,而不是完整的请求。主动攻击者很容易攻击系统,尤其是在没有重播保护的情况下(即使有重播保护,也存在此缺陷)。例如,我可以从一条消息中捕获时间戳、hmac(带有机密的时间戳),然后在我自己的消息中使用它,服务器将接受它。

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

    根据您的威胁场景,您可以添加重播保护,也可以注意到不需要这样做,因为当完全重播消息时不会导致任何问题。

        7
  •  1
  •   TIPS    13 年前

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

    因此,除了其他答案外,请记住以下几点:

    如果用密码开始散列,就可以预先计算彩虹表,并快速地添加可信的时间戳值,如果从时间戳开始,则很难做到这一点。

    所以,而不是使用 sha1(“我的密钥”+“时间戳”)

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

        8
  •  0
  •   John    8 年前

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

    因为尽管它是 技术上 当您通过互联网发送纯文本“数据和数据的散列+机密”时,很难强制或反转SHA散列,如上所述,在捕获足够的数据样本后,可以智能地获取机密。想想看-你的数据可能在改变,但密钥保持不变。所以每次发送一个新的数据blob时,它都是一个运行基本破解算法的新示例。对于包含不同数据的两个或多个示例以及数据+机密的哈希,可以验证您确定的机密是否正确,而不是假阳性。

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

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

    注:这是英国人在二战期间破解神秘密码的方法之一,从而有利于盟国。

    有什么想法吗?

        9
  •  0
  •   lovasoa    7 年前

    sha1旨在防止从哈希恢复原始文本。然而, SHA1 databases exists ,允许通过其sha哈希查找常见密码。