是否可以解密之前使用Java中的SHA-1算法加密的字符串?
答案 0 :(得分:12)
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个字符破解一个则平均需要数万亿年。
答案 1 :(得分:2)
不,这是不可能的,因为SHA-1是一个哈希 - 它是单向票。如果要加密和解密字符串,则需要使用一些使用密钥生成加密数据的加密算法。然后,您可以加密数据并成功解密后。例如AES。您可以从here
了解AES答案 2 :(得分:2)
简短回答:这是不可能的。
因为SHA-1是cryptographic hash function,根据鸽子原理,在数学上不可能逆转。只有2个 160 可能的SHA-1哈希值。由于存在无限数量的可能输入字符串,因此必须存在冲突(多个输入散列到相同的值)。一般来说,你无法知道哪些字符串是原始输入。
然而,真实世界的字符串并非完全随意。如果您知道有关输入字符串的一些信息(例如,它长度少于5个字符),概率很高,则输入是唯一的。对你来说不幸的是,像SHA-1这样的散列函数在计算上是无法反转的。 (对SHA-1有理论上的攻击,但我认为目前认为任何一种都不可行。)
因此,如果您需要恢复散列数据,则必须使用暴力:尝试对每个长度小于 n 的字符串进行SHA-1,并查看散列是否匹配。但是指数长度达到 n 的指数很多,所以这很快变得不可行。
在宇宙结束之前有一种可能的方法来恢复散列数据。您唯一的希望是使用更复杂的方法,例如rainbow tables。如果您知道原始字符串非常短(少于~15个字符),这将仅工作。即使对于短字符串,也需要很长时间(和千兆字节的磁盘空间)来预先计算表。