散列取决于输入,对于相同的输入,将提供相同的输出。
因此,除了其他答案,请记住以下几点:
如果使用密码启动哈希,则可以预先计算彩虹表,并快速添加合理的时间戳值,如果从时间戳开始,这将更加困难。
所以,而不是使用 sha1(“我的密钥”+“时间戳”)
去做 sha1(“时间戳”+“我的秘密密钥”)
我相信接受的答案是 技术上 正确但错误,因为它适用于用例:创建&通过公共/非可信媒体传输防篡改数据。
因为虽然如此 技术上 如上所述,当您通过互联网发送纯文本“数据和数据的散列+秘密”时,非常难以暴力破解或反转SHA散列,可以在捕获足够的信息后智能地获取秘密您的数据样本。想一想 - 你的数据可能正在改变,但秘密密钥保持不变。因此,每次发送新的数据blob时,它都是运行基本破解算法的新示例。包含2个或更多包含不同数据和样本的样本数据+秘密的哈希值,您可以验证您确定的秘密是否正确而不是误报。
这种情况类似于Wifi破解者在捕获足够的数据包后破解wifi密码的方式。收集到足够的数据后,即使您在技术上没有反转SHA1甚至SHA256,生成密钥也是微不足道的。确保您的数据未被篡改或验证您在另一端与谁通话的唯一方法是使用GPG等(公钥和私钥)加密整个数据blob。当您正在散列的数据可见时,散列本质上总是不安全。
实际上,它实际上取决于您首先进行散列的应用和目的。如果所需的安全级别微不足道或者说您在100%完全受信任的网络中,那么也许散列将是一个可行的选择。希望网络上没有人或任何入侵者对您的数据感兴趣。否则,据我所知,此时唯一可靠的可行选项是基于密钥的加密。您可以加密整个数据blob或只签名。
注意:这是英国人在二战期间破解Enigma代码的方式之一,从而有利于盟军。
有什么想法吗?
SHA1旨在防止从哈希中恢复原始文本。然而, SHA1数据库存在 ,允许通过SHA哈希查找公共密码。
注意,针对MD5和SHA-1的最佳攻击是关于找到任意两个任意消息m1和m2,其中h(m1)= h(m2)或找到m2使得h(m1)= h(m2)和m1!=平方米。找到m1,给定h(m1)仍然是计算上不可行的。
此外,您正在使用MAC(消息身份验证代码),因此攻击者无法在不知道秘密的情况下忘记消息,但有一点需要注意 - 您使用的一般MAC结构容易受到长度扩展攻击 - 攻击者在某些情况下可以伪造给定m2,h(秘密,m2)的消息m2 | m3,h(秘密,m2 | m3)。这不仅仅是时间戳的问题,但是当您在任意长度的消息上计算MAC时,这是一个问题。您可以将秘密附加到时间戳而不是预先挂起,但一般情况下,最好使用带有SHA1摘要的HMAC(HMAC只是构造,可以使用MD5或SHA作为摘要算法)。
最后,您只签署时间戳而不是完整请求。主动攻击者可以轻松攻击系统,尤其是在没有重放保护的情况下(尽管即使有重放保护,也存在此缺陷)。例如,我可以从一条消息中捕获时间戳,HMAC(带有机密的时间戳),然后在我自己的消息中使用它,服务器将接受它。
最好发送消息,HMAC(消息)有足够长的秘密。可以确保服务器的消息完整性和客户端的真实性。
您可以根据您的威胁情况添加重播保护,或者注意没有必要,因为完整重播时的消息不会导致任何问题。
你不能反转SHA-1加密字符串并不完全正确。
你不能直接反转一个,但它可以用彩虹表完成。
维基百科: 彩虹表是用于反转加密散列函数的预计算表,通常用于破解密码哈希。表通常用于恢复明文密码,直到由一组有限的字符组成的特定长度。
从本质上讲,SHA-1只能与使用密码的强度一样安全。如果用户使用具有模糊字符组合的长密码,则现有彩虹表不太可能具有加密字符串的密钥。
您可以在此处测试加密的SHA-1字符串: http://sha1.gromweb.com/
互联网上还有其他彩虹表,您可以使用Google反向SHA1。