【问题标题】:How to decrypt sha1-encrypted String in Java如何在 Java 中解密 sha1 加密的字符串
【发布时间】:2011-12-05 20:02:05
【问题描述】:

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

【问题讨论】:

  • SHA-1 是哈希,而不是加密算法。如果您尝试从其 SHA-1 哈希中提取字符串,祝您好运。这称为原像攻击。
  • 这是可能,但需要计算资源和时间,因为 sha1 加密的数据一旦加密就不会被解密。
  • 我认为问题应该是解密 sha1 的计算密集程度如何。 Java与它有什么关系?如果你有一个好的算法,你可以使用任何语言对其进行编码。

标签: java encryption hash cryptography sha1


【解决方案1】:

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 RipperHashcat 这样的软件可能是你最好的选择。请注意,这通常适用于密码,因为它们很短且易于猜测,但随着输入的增加,难度呈指数级增加。您可以在几分钟内破解一个输入 6 个字符的 SHA-1 哈希,而破解一个输入 16 个字符的哈希平均需要数万亿年。

【讨论】:

  • 这种方法需要大量的空间和时间以及合理大小的列表。更实用的替代方法是使用rainbow table 以应用时间-内存权衡。不过这种方法对于加盐的哈希是没用的
  • @jsvk - 我并不是说这是个好主意。事实上,我希望这个例子能说明它是多么的毫无意义,除非你知道要猜什么。它可以改进,但实际上,没有人使用他们自己的密码破解器——当然也不是用 Python 编写的;)
【解决方案2】:

不,这是不可能的,因为 SHA-1 是一个哈希 - 这是一张单程票。如果要加密和解密字符串,则需要使用某种加密算法,该算法使用密钥生成加密数据。然后您可以加密数据并成功解密后。例如 AES。您可以从here 阅读有关 AES 的信息

【讨论】:

    【解决方案3】:

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

    因为 SHA-1 是一个cryptographic hash function,根据鸽巢原理,它在数学上是不可能逆转的。只有 2160 个可能的 SHA-1 哈希值。由于有无限数量的可能输入字符串,因此必须存在冲突(哈希到相同值的多个输入)。一般来说,您无法知道这些字符串中的哪一个是原始输入。

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

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

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

    【讨论】:

    • 请更新:很有可能,我只需要算法。 sha1-decrypter 是您可以找到在线解密器的页面的链接
    • @VineetVerma:那不是解密器;这是一个反向查找。它使用的代码本质上是Map<SHA1, byte[]> lookup = new HashMap<SHA1, byte[]>(); /*add some common inputs*/; return lookup.get(sha1sum);。只有当他们碰巧将您要查找的输入添加到地图时,它才会起作用。
    猜你喜欢
    • 1970-01-01
    • 2018-03-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-02-07
    • 1970-01-01
    • 2012-07-29
    • 1970-01-01
    相关资源
    最近更新 更多