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

时间:2011-10-12 05:05:08

标签: java encryption hash cryptography sha1

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

3 个答案:

答案 0 :(得分:12)

SHA1是cryptographic hash function,整个观点是您无法撤消它。如果可以反转哈希(找到给定哈希的输入),那么它就没用了。如果您需要加密某些内容并稍后对其进行解密,则应使用encryption functionAES 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 RipperHashcat这样的软件可能是你最好的选择。请注意,这通常适用于密码,因为它们很短且易于猜测,但随着输入的增加,难度会呈指数增长。您可以在几分钟内使用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个字符),这将工作。即使对于短字符串,也需要很长时间(和千兆字节的磁盘空间)来预先计算表。