是否有可能扭转sha1?

时间:2010-02-10 07:22:21

标签: security sha1

是否可以撤销sha1?

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

假设我使用“密钥”输入创建一个这样的sha1,并用时间戳调整它,以便sha一直在变化。

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

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

但这是真的吗?

如果你知道我是这样做的,你会知道我确实在那里放了一个时间戳,你会看到sha1。 那么你可以使用这两个并找出“秘密密钥”吗?

secret_key = bruteforce_sha1(sha1, timestamp)

由于 约翰


注1 : 我想你可能会以某种方式暴力,但实际上会有多少工作?

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

9 个答案:

答案 0 :(得分:39)

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

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

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

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

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

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

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

答案 1 :(得分:24)

SHA-1是一个hash function,旨在使反向操作变得不切实际。出于这个原因,这种散列函数通常称为one-way functionscryptographic hash functions

然而,SHA-1有一些recently discovered weaknesses,可以比通过对所有输入进行强力搜索更快地找到输入。你应该考虑使用像SHA-256这样的更强大的东西用于新的应用程序。

SHA-1上的

Jon Callas

  

是时候走路了,但没有跑到火灾出口。你看不到烟雾,但是火警已经消失了。

答案 2 :(得分:15)

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

标准化的原因是使用消息摘要,例如的 HMAC

您发送消息明文以及该消息的附加散列,其中包含您的秘密。

所以不是你的:

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

你有:

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

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

这是行业标准和安全验证邮件的方式,无论它们是否加密。


(这就是为什么你不能暴露哈希:)

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

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

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

因此,从根本上说,没有办法可以确定地反转哈希。

答案 3 :(得分:9)

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

所以,不,哈希函数无法逆转。但你可以寻找这样的碰撞。


修改

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

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

答案 4 :(得分:3)

不能完全反转SHA-1加密字符串。

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

百科: 彩虹表是用于反转加密哈希函数的预计算表,通常用于破解密码哈希值。表格通常用于恢复明文密码,最长可达一定长度的字符。

基本上,SHA-1只能与使用密码的强度一样安全。如果用户的密码长度模糊不清,则现有的彩虹表不太可能有加密字符串的密钥。

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

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

答案 5 :(得分:2)

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

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

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

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

您可以根据自己的威胁情况添加重播保护,或者注意不需要,因为完整重播后的消息不会导致任何问题。

答案 6 :(得分:1)

哈希值取决于输入,对于相同的输入,将提供相同的输出。

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

如果您使用密码启动哈希,则可以预先计算彩虹表,并快速添加合理的时间戳值,如果您从时间戳开始,这将更加困难。

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

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

答案 7 :(得分:0)

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

因为虽然技术上非常难以暴力破解或反转SHA哈希,但是当您发送纯文本时,数据&数据的散列+秘密"通过互联网,如上所述,在捕获足够的数据样本后,可以智能地获取秘密。想一想 - 你的数据可能正在改变,但秘密密钥保持不变。因此,每次发送新的数据blob时,它都是运行基本破解算法的新示例。包含2个或更多包含不同数据和样本的样本数据+秘密的哈希值,您可以验证您确定的秘密是否正确而不是误报。

这种情况类似于Wifi破解程序在捕获足够的数据包后破解wifi密码的方式。收集到足够的数据后,即使您在技术上没有转换SHA1甚至SHA256,生成密钥也是微不足道的。确保您的数据未被篡改或验证您在另一端与谁通话的唯一方法是使用GPG等(公钥和私钥)加密整个数据blob。当您正在散列的数据可见时,散列本质上总是不安全。

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

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

对此有何想法?

答案 8 :(得分:0)

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