是否有可能扭转sha1?

是否有可能扭转sha1?

我正在考虑使用sha1创build一个简单的轻量级系统来validation通过未encryption连接进行通信的小型embedded式系统。

假设我用一个“秘密密钥”创build了一个这样的sha1,并给它添加一个时间戳,这样sha就会一直改变。

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

然后我把这个sha1包含在通信和服务器上,可以做相同的计算。 希望没有人能够弄清楚“秘密钥匙”。

但这是真的吗?

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

 secret_key = bruteforce_sha1(sha1, timestamp) 

感谢Johan


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

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

不,你不能反转SHA-1,这就是为什么它被称为安全哈希algorithm。

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

而现在你可能应该使用SHA-256来处理新系统。

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

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

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

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

SHA-1是一个哈希函数 ,它被devise成使逆转操作不切实际困难。 由于这个原因,这样的散列函数通常被称为单向函数或encryption散列函数 。

然而,SHA-1有一些最近发现的弱点 ,可以通过对所有input进行蛮力search来快速findinput。 你应该考虑使用更强大的像SHA-256的新应用程序。

乔恩·卡拉斯在SHA-1:

现在是时候走,但不跑,到火警出口。 你看不到烟雾,但火警已经熄灭。

问题是如何通过不安全的会话进行身份validation。

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

你发送的信息明文以及你的秘密混合在一起的消息相应的散列。

所以,而不是你的:

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

你有:

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

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

这是validation消息的行业标准和安全方式,不pipe它们是否encryption。


(这就是为什么你不能捣毁哈希:)

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

正如你所知道的那样,你可以对时间戳的范围进行合理的猜测,然后你可以迭代所有的时间戳,计算哈希值并进行比较。

当然,你检查范围内的两个或多个时间戳可能会“碰撞”,即虽然时间戳是不同的,但它们会生成相同的散列。

所以从根本上说,没有任何方法可以扭转哈希。

用math术语来说,只有双射函数具有反函数。 但是哈希函数不是内射的,因为有多个input值会导致相同的输出值(碰撞)。

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


编辑

当你想validation你的系统之间的通信,我会build议使用HMAC 。 计算消息authentication码的这个结构可以使用不同的散列函数。 您可以使用SHA-1,SHA-256或任何你想要的散列函数。

为了validation对特定请求的响应,我会发送一个随机数,以及需要用作salt来validation响应的请求。

注意对MD5和SHA-1的最好的攻击是find任意两个任意消息m1和m2,其中h(m1)= h(m2)或者findm2使得h(m1)= h(m2)和m1!=平方米。 发现m1,给定h(m1)仍然是计算不可行的。

而且,你正在使用一个MAC(消息authentication码),所以攻击者不能忘记一个消息而不知道秘密 – 你使用的一般MAC构造容易受到长度扩展攻击 – 攻击者可以在某些情况下伪造消息m2 | m3,h(秘密,m2 | m3)给定m2,h(秘密,m2)。 这不是一个只有时间戳的问题,但是当您通过任意长度的消息计算MAC时,这是一个问题。 您可以将密码附加到时间戳,而不是预先挂起,但一般情况下,您最好使用HMAC和SHA1摘要(HMAC只是构build,可以使用MD5或SHA作为摘要algorithm)。

最后,你正在签署的时间戳,而不是完整的请求。 主动攻击者可以很容易地攻击系统,特别是如果你没有重放保护(虽然即使有重放保护,这个缺陷也存在)。 例如,我可以从一条消息中捕获时间戳,HMAC(带有秘密的时间戳),然后在我自己的消息中使用它,服务器将接受它。

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

您可以根据您的威胁情况添加重播保护,或者注意这是不必要的,因为整个重播时的消息不会造成任何问题。

您不能反转SHA-1encryptionstring。

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

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

从本质上讲,SHA-1与使用的密码一样安全。 如果用户使用长字符组合的密码长,那么现有的彩虹表就不可能有encryptionstring的密钥。

您可以在这里testing您的encryption的SHA-1string: http : //sha1.gromweb.com/

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

散列取决于input,对于相同的input将产生相同的输出。

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

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

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

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

我相信接受的答案在技术上是正确的,但却是错误的,因为它适用于用例:在公共/不可信介质上创build并传输防篡改数据。

因为尽pipe在技术上非常难以暴力破坏SHA SHA,但是如上所述,当您通过互联网发送纯文本“数据和数据散列”时,可以智能地获得捕获足够的数据样本后保密。 考虑一下 – 你的数据可能会改变,但密钥保持不变。 所以每次你发送一个新的数据blob,这是运行基本的破解algorithm的新样本。 对于包含不同数据和散列数据+秘密的2个或更多样本,您可以validation您确定的秘密是否正确,而不是假阳性。

这种情况类似于Wificookies在捕获足够的数据包之后如何破解wifi密码。 在收集足够的数据之后,即使您没有在技术上颠倒SHA1甚至SHA256,也无法生成密钥。 确保您的数据没有被篡改或者在另一端validation您与谁通话的唯一方法是使用GPG或类似的方法(公钥和私钥)对整个数据块进行encryption。 当散列数据可见时,散列本质上始终不安全。

实际上,这实际上取决于你为什么要散列的应用和目的。 如果所需的安全级别是微不足道的,或者说你是完全信任的100%的networking,那么哈希可能是一个可行的select。 希望networking上没有人或者任何入侵者对你的数据感兴趣。 否则,就目前我能确定的唯一可行的select是基于密钥的encryption。 你可以encryption整个数据blob或只是签名。

注意:这是英国人在第二次世界大战期间能够破解Enigma密码的一种方式,导致了盟友的青睐。

对此有何想法?

SHA1旨在防止从哈希中恢复原始文本。 但是, 存在SHA1数据库 ,允许通过其SHA哈希来查找通用密码。