是否可以解密某些先前使用Java中的SHA-1算法加密的字符串?如何在Java中解密sha1加密的字符串
回答
SHA1是cryptographic hash function,整个问题是您无法撤消它。如果可以颠倒散列(找到给定散列的输入),它就没用了。如果您需要加密某些内容并稍后将其解密,则应使用encryption function,如AES或RSA。
但是,对于非常简单的输入,可以通过猜测输入是什么并检查散列是否相同来输入crack the hash function。
例Python代码:
def crack_hash(hash_to_crack, hash_function, list_of_guesses):
# Try to hash everything in our guess list
for guess in list_of_guesses:
new_hash = hash_function(guess)
# if the hashes match, we found it
if new_hash == hash_to_crack:
return guess
# If none of them match, give up
return None
当然,如果你真的想破解高效散列,使用软件一样John the Ripper或Hashcat可能是你最好的选择。请注意,这通常适用于密码,因为它们很短并且容易猜到,但随着输入的增加,难度将呈指数级增长。您可以在几分钟内破解每个带有6个字符输入的SHA-1哈希,而使用16个字符破解一个平均需要数万亿年。
这种方法需要大量的空间和时间以及合理大小的列表。更实际的选择是利用[彩虹表](http://en.wikipedia.org/wiki/Rainbow_table)来应用时间记忆折衷。这种方法对于盐渍散列没用,尽管 – jsvk
@jsvk--我不是说这是个好主意。事实上,我希望这个例子能说明这是多么毫无意义,除非你有一个好主意来猜测。它可以得到改进,但实际上,没有人使用他们自己的密码破解程序 - 当然不是用Python编写的;) –
不,这是不可能的,因为SHA-1是一个散列 - 它是单向票证。如果你想隐藏和解密一个字符串,那么你需要使用一些使用密钥来生成加密数据的加密算法。然后你可以加密数据,并在成功解密之后。例如AES。你可以从here
阅读关于AES的简短回答:这是不可能的。
由于SHA-1是一个cryptographic hash function,根据鸽巢原理,在数学上不可能逆转。只有2 可能的SHA-1散列。由于有无限数量的可能输入字符串,因此必须有冲突(多个输入散列为相同的值)。一般来说,您无法知道哪些字符串是原始输入。
但是,真实世界的字符串并不完全是任意的。如果您知道一些关于您的输入字符串的信息(例如,它的长度小于5个字符),则很有可能输入是唯一的。不幸的是,像SHA-1这样的散列函数有意在计算上不可逆转。 (对SHA-1有理论上的攻击,但我认为目前还没有任何可行的解决方案。)
所以如果你需要恢复散列数据,你必须使用暴力破解:尝试使用SHA-1ing字符串长度小于n,并查看散列是否匹配。但是,成倍增长的字符串长度高达n,所以这很快就变得不可行。
有一种可能的方法来在宇宙结束之前恢复散列数据。你唯一的希望是使用更复杂的方法,如rainbow tables。这将只有工作,如果你知道你的原始字符串很短(少于15个字符)。即使对于短字符串,也需要很长时间(和千兆字节的磁盘空间)来预先计算表。
请更新:这很可能,我只需要算法。 [sha1解密器](http://www.stringfunction.com/sha1-decrypter.html)是链接到您可以找到在线解密器页面的链接 –
@VineetVerma:这不是解密器;这是一个反向查找。它使用的代码本质上是:Map
- 1. 如何在AES加密中加密/解密多个字符串?
- 2. 如何在使用JS加密技术加密的Java字符串中解密
- 3. 如何解密java中的加密字符串
- 4. 加密/解密字符串
- 5. 解密字符串加密
- 6. 如何解密在Delphi中加密的C#中的字符串
- 7. 在javascript中加密字符串和在java中解密
- 8. AES加密 - 如何以后解密加密的字符串?
- 9. javascript中的字符串加密和java中的解密
- 10. 在java中加密和解密字符串
- 11. 如何解密用crypt加密的PHP密码字符串?
- 12. 如何在iOS中解密DES加密字符串?
- 13. 如何在C#中对字符串进行加密和解密#
- 14. 如何完成在android中加密和解密字符串值?
- 15. 加密密钥和加密字符串的解密
- 16. 如何从sha1()在PHP中获取加密字符的原始字符串?
- 17. 如何解密字符串
- 18. 加密和解密一个字符串
- 19. 加密和解密字符串
- 20. 加密/解密字符串(PHP)
- 21. 加密和解密一个字符串。
- 22. 解密SHA加密字符串
- 23. RSA字符串加密\解密
- 24. SHA1在VB.Net中的解密
- 25. Java字符串加密
- 26. Java:如何解码使用已知密钥在php上加密的字符串?
- 27. 仅使用java中的密码加密对字符串字符进行加密
- 28. Java不可靠的RSA加密/解密字符串
- 29. Java和PHP之间的加密/解密字符串
- 30. 发出C++中的加密字符串并在PHP中解密
SHA-1是一个散列,而不是一个加密算法。如果你试图从它的SHA-1哈希中提取一个字符串,祝你好运。这就是所谓的图像前攻击。 – Mysticial
它是_possible_,但需要计算资源和时间,因为sha1加密的数据一旦加密就不会被解密。 – jsvk
我认为这个问题应该是解密sha1的计算密集程度。 Java与它有什么关系?如果你有一个好的算法,你可以使用任何语言来编写它。 –