如何在Java中解密sha1加密的String

是否有可能解密之前使用Java中的SHA-1算法加密的字符串?

SHA1是一个加密哈希函数 ,整个观点是你无法撤消它。 如果可以反转哈希(找到给定哈希的输入),那么它就没用了。 如果您需要加密某些内容并稍后解密,则应使用AES或RSA等加密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个字符破解一个则平均需要数万亿年。

不,这是不可能的,因为SHA-1是一个哈希 – 它是单向票。 如果要加密和解密字符串,则需要使用一些使用密钥生成加密数据的加密算法。 然后,您可以加密数据并成功解密后。 例如AES。 您可以从这里阅读AES

简短的回答:这是不可能的。

因为SHA-1是加密哈希函数 ,所以根据鸽子原理,在数学上不可能反转。 只有2 160个可能的SHA-1哈希值。 由于存在无限数量的可能输入字符串,因此必须存在冲突(多个输入散列到相同的值)。 通常,您无法知道哪些字符串是原始输入。

但是,真实世界的字符串并不是完全随意的。 如果您知道有关输入字符串的一些信息(例如,它长度少于5个字符),则概率很高,输入是唯一的。 不幸的是,像SHA-1这样的散列函数在计算上是无法反转的。 (对SHA-1有理论上的攻击,但我认为目前认为任何一种都不可行。)

因此,如果您需要恢复散列数据,则必须使用暴力:尝试SHA-1ing每个长度小于n的字符串,并查看散列是否匹配。 但是指数长度达到n的指数很多,所以这很快变得不可行。

有一种可能的方法可以在Universe结束之前恢复散列数据 。 您唯一的希望是使用更复杂的方法,例如彩虹表 。 这只有在您知道原始字符串非常短(少于~15个字符) 时才有效。 即使对于短字符串,也需要很长时间(和千兆字节的磁盘空间)来预先计算表。