首页 文章

是否有可能解密MD5哈希?

提问于
浏览
223

有人告诉我他见过软件系统:

  • 从其他系统检索MD5加密密码;

  • 解密加密的密码和

  • 使用系统自己的算法将密码存储在系统的数据库中 .

那可能吗?我认为解密MD5哈希是不可能/不可行的 .

我知道有MD5词典,但是有没有实际的解密算法?

23 回答

  • 9

    MD5不是加密(尽管它可能被用作某些加密算法的一部分),它是单向的hash function . 许多原始数据实际上是转化的一部分 .

    想一想:MD5总是128位长 . 这意味着有2128个可能的MD5哈希值 . 这是一个相当大的数字,但它绝对是有限的 . 然而,给定的散列函数有无数个可能的输入(并且它们中的大多数包含超过128位,或者只有16个字节) . 因此,对于将散列到相同值的数据实际上存在无限多种可能性 . 使哈希变得有趣的是,找到两个散布到相同值的数据是非常困难的,并且偶然发生的几率几乎为0 .

    (非常不安全)哈希函数的一个简单示例(这说明它是单向的一般概念)是获取一段数据的所有位,并将其视为大数 . 接下来,使用一些大的(可能是素数)数字n执行整数除法,并取余数(参见:Modulus) . 您将在0和n之间留下一些数字 . 如果您再次执行相同的计算(任何时间,在任何计算机上,任何地方),使用完全相同的字符串,它将提供相同的值 . 然而,没有办法找出原始值是什么,因为有无数个数字具有精确的余数,除以n .

    也就是说,已发现MD5存在一些缺点,因此通过一些复杂的数学运算,可能会在不尝试输入2128个输入字符串的情况下找到碰撞 . 事实上,大多数密码都很短,人们经常使用常见值(如"password"或"secret")意味着在某些情况下,您可以通过Google搜索哈希或使用Rainbow table对某人的密码做出相当好的猜测 . 这就是为什么你应该总是“salt”散列密码的一个原因,这样两个相同的值,当散列时,不会散列到相同的值 .

    一旦数据通过哈希函数运行,就不会再回头了 .

  • 7

    你不能 - 理论上 . 哈希的全部意义在于它只是一种方式 . 这意味着如果有人设法获取哈希列表,他们仍然无法获取您的密码 . 此外,这意味着即使有人在多个站点上使用相同的密码(是的,我们都知道我们不应该,但是......)任何有权访问站点A数据库的人都无法使用用户的密码网站B.

    MD5是哈希的事实也意味着它丢失了信息 . 对于任何给定的MD5哈希,如果允许任意长度的密码,可能会有多个密码产生相同的哈希值 . 对于一个好的哈希来说,找到它们超出一个非常微不足道的最大长度在计算上是不可行的,但这意味着不能保证如果你找到一个具有目标哈希的密码,那么天文数据不太可能你不可能 .

    MD5是用于密码的错误哈希:

    • 它's fast, which means if you have a 1569379 hash, it'便宜尝试大量的密码,看看你是否能找到一个哈希到那个目标 . Salting对这种情况没有帮助,但是尝试使用不同的盐找到与多个哈希中的任何一个匹配的密码会使其变得更加昂贵 .

    • 我相信它已知存在使得更容易发现碰撞的缺陷,尽管在可打印文本中找到碰撞(而不是任意二进制数据)至少会更难 .

    我不是安全专家,因此除了“不要推出自己的身份验证系统”之外,不会提出具体建议 . 从信誉良好的供应商那里找到一个,并使用它 . 安全系统的设计和实现都是一项棘手的工作 .

  • 4

    Technically, it's 'possible' ,但在 very strict conditionsrainbow tables,基于用户密码在该哈希数据库中的极小可能性的强制执行) .

    但这并不意味着它

    • 可行
      要么

    • 安全

    You don't want to 'reverse' an MD5 hash. 使用下面概述的方法,你可以实际上认为'MD5实际上被认为是 malicious - 一些网站提供了'crack'和暴力破解MD5哈希的能力 - 但它们都是包含字典单词,以前提交的密码和其他单词的海量数据库 . 它需要反转的MD5哈希的可能性非常小 . And if you've salted the MD5 hash - this won't work either! :)


    The way logins with MD5 hashing should work is:

    During Registration: 用户创建密码 - >密码使用MD5进行哈希 - >存储在数据库中的哈希

    During Login:
    用户输入用户名和密码 - >(用户名已选中)密码使用MD5哈希 - >哈希与数据库中存储的哈希进行比较

    When 'Lost Password' is needed:

    2 options:

    • 用户发送了一个随机密码登录,然后在首次登录时更改密码 .

    or

    • 用户被发送一个链接来更改他们的密码(如果您有安全问题/等额外检查),然后新密码被哈希并用数据库中的旧密码替换
  • 373

    不是直接的 . 由于pigeonhole principle,(可能)有多个值散列到任何给定的MD5输出 . 因此,你无法肯定地扭转它 . 此外,MD5使得很难找到任何这样的反向散列(但是有一些攻击会产生collisions - 也就是说,产生两个散列到相同结果的值,但是你无法控制得到的MD5值会是什么是) .

    但是,如果将搜索空间限制为长度小于N的常用密码,则可能不再具有不可逆性属性(因为MD5输出的数量远远大于感兴趣域中的字符串数) . 然后你可以使用rainbow table或类似的反向哈希 .

  • 7

    不可能,至少在合理的时间内没有 .

    通常处理的方式是密码“重置” . 也就是说,您给他们一个新的(随机)密码并将其发送到电子邮件中 .

  • 1

    您无法还原md5密码 . (使用任何语言)

    但是你可以:

    给用户一个新的 .

    检查一些彩虹表可能检索旧的 .

  • 8

    不,他一定对MD5词典感到困惑 .

    加密哈希值(MD5等)是 one way 并且除非您有关于原始邮件等的其他信息,否则您无法仅使用摘要回复原始邮件 .

  • 3

    解密(以算法的方式直接从散列值中获取纯文本),否 .

    但是,有些方法使用所谓的rainbow table . 如果您的密码是在没有盐的情况下进行哈希处理,那将非常可行

  • 12

    MD5是一种哈希算法,您无法还原哈希值 .

    您应该添加“更改密码功能”,其中用户提供另一个密码,计算哈希值并将其存储为新密码 .

  • 2

    没有简单的方法可以做到这一点 . 这是首先对密码进行哈希处理的一点 . :)

    您应该能够做的一件事是手动为它们设置临时密码并将其发送给它们 .

    我不愿提及这个,因为它无法保证无论如何都能正常工作),但你可以尝试查找像milw0rm这样的彩虹表中的哈希,看看你是否能以这种方式恢复旧密码 .

  • 151

    在这里查看所有其他答案,关于它是如何以及为什么它不可逆,以及为什么你不想要 .

    为了完整性,有rainbow tables,您可以查找可能的匹配 . 无法保证彩虹表中的答案将是您的用户选择的原始密码,因此会极大地混淆它们 .

    此外,这不适用于盐渍哈希 . Salting是许多安全专家推荐的 .

  • 50

    在找到它的反函数方面,没有办法“恢复”哈希函数 . 如前所述,这是具有哈希函数的重点 . 它不应该是可逆的,它应该允许快速哈希值计算 . 因此,找到产生给定散列值的输入字符串的唯一方法是尝试所有可能的组合 . 由于这个原因,这被称为暴力攻击 .

    尝试所有可能的组合需要花费大量时间,这也是使用哈希值以相对安全的方式存储密码的原因 . 如果攻击者能够使用所有用户密码访问您的数据库,则无论如何都会松动 . 如果你有哈希值和(理想情况下)强密码,那么获取密码将会困难得多密码超出攻击者的哈希值 .

    存储哈希值也不是性能问题,因为计算哈希值相对较快 . 因此,大多数系统所做的是计算用户键入的密码的哈希值(这很快),然后将其与用户数据库中存储的哈希值进行比较 .

  • 6

    MD5被认为是破碎的,不是因为你可以从哈希中取回原始内容,而是因为有了工作,你可以制作两个散列到相同哈希的消息 .

    您不能取消哈希MD5哈希 .

  • 30

    唯一可以工作的是(如果我们提到密码只是哈希,没有添加任何种类的盐来防止重放攻击,如果是这样你必须知道盐)顺便说一句,得到一个字典攻击工具,许多单词,数字等文件然后创建两行,一行是单词,数字(在字典中),另一行是单词的哈希值,如果匹配则比较哈希值...

    这是唯一的方法,无需进入密码分析 .

  • 2

    是的,正是你要求的是可能的 . 没有帮助就无法“解密”MD5密码,但可以将MD5密码重新加密到另一个算法中,而不是一次性完成 .

    您所做的是安排您的用户使用旧的MD5密码登录到您的新系统 . 在他们登录时,他们已经为您的登录程序提供了一个密码的 unhashed 版本,您证明该密码与您拥有的MD5哈希值相匹配 . 然后,您可以将此未散列的密码转换为新的哈希算法 .

    显然,这是一个扩展的过程,因为你必须等待你的用户告诉你密码是什么,但它确实有效 .

    (注意:七年后,哦,希望有人会发现它很有用)

  • -1

    您可以找到使用字典检索原始邮件的在线工具 .

    在某些情况下,字典方法可能只是无用的:

    • 如果使用SALT消息对消息进行哈希处理

    • 如果消息是哈希多次

    例如,这是一个MD5 decrypter在线工具 .

  • 13

    不,它无法完成 . 要么你可以使用字典,要么你可以尝试散列不同的值,直到你得到你正在寻找的哈希值 . 但它不能“解密” .

  • 1

    MD5有它的弱点(见Wikipedia),所以有一些项目试图预先计算哈希 . 维基百科也暗示了其中一些项目 . 我所知道的(和尊重)是ophrack . 您无法告诉用户他们自己的密码,但您可以告诉他们一个有效的密码 . 但我认为:只要邮寄新密码就可以忘记了 .

  • 1

    MD5哈希算法是不可逆的,因此MD5解码不可能,但有些网站有大量的密码匹配,所以你可以尝试在线解码MD5哈希 .

    在线试用:

    MD5 Decrypt

    md5online

    md5decrypter

  • -1

    理论上,不可能解密哈希值,但是你有一些肮脏的技术可以恢复原始纯文本 .

    • Bruteforcing :所有计算机安全算法都受到bruteforcing的影响 . 基于这个想法,今天的GPU采用并行编程的思想,使用它可以通过使用任何图形处理器大规模地强制它来恢复纯文本 . 这个工具hashcat做了这个工作 . 上次我检查了它的cuda版本时,我能够在六分钟内强行使用一个7个字母的长字符 .

    • Internet search :只需在Google上复制并粘贴哈希,然后查看是否可以在那里找到相应的明文 . 当你在测试某些东西时,这不是一个解决方案,但绝对值得一试 . 有些网站维护字典中几乎所有单词的哈希值 .

  • 2

    不,不可能反转诸如MD5的散列函数:给定输出散列值,除非知道关于输入消息的足够信息,否则不可能找到输入消息 .

    解密不是为哈希函数定义的函数;加密和解密是密码的功能,例如CBC模式下的AES;哈希函数不加密也不解密 . 散列函数用于 digest 输入消息 . 顾名思义,设计中没有可能的反向算法 .


    MD5被设计为加密安全的 one-way 哈希函数 . 现在很容易为MD5生成冲突 - 即使输入消息的大部分是预先确定的 . 因此MD5正式破解,MD5不应被视为a加密安全哈希了 . 然而,仍然不可能找到导致哈希值的输入消息:当只有H(X)已知时找到X(并且X没有预先计算的结构,其中至少有一个128字节的预计算数据块) . MD5有 no known pre-image attacks .

    通常也可以使用强力或(增强的)字典攻击来猜测密码,比较数据库或尝试在所谓的彩虹表中找到密码哈希值 . 如果找到匹配,则在计算上确定已找到输入 . 散列函数也可以抵御冲突攻击:查找 X' 以便 H(X') = H(X) 给出 H(X) . 因此,如果发现 X ,则在计算上确定它确实是输入消息 . 否则你毕竟会进行碰撞攻击 . 彩虹表可以用来加速攻击,并有专门的互联网资源,可以帮助您找到给定特定哈希的密码 .

    当然可以重用哈希值 H(X) 来验证在其他系统上生成的密码 . 接收系统唯一要做的就是存储以 H(X) 为输入的确定性函数 F 的结果 . 当 X 被赋予系统时,可以重新计算 H(X) ,因此可以重新计算 F 并且可以比较结果 . 换句话说,不需要解密哈希值来验证密码是否正确,并且您仍然可以将哈希存储为不同的值 .


    而不是MD5,重要的是使用 password hash 或PBKDF(基于密码的密钥派生函数) . 这样的函数指定如何将 salt 与散列一起使用 . 这样,不会为相同的密码(来自其他用户或其他数据库)生成相同的哈希值 . 密码哈希因为这个原因也不允许使用彩虹表,只要盐足够大并且适当随机化 .

    密码哈希还包含 work factor (有时使用迭代计数配置),可以显着减慢尝试在给定salt和哈希值时找到密码的攻击 . 这很重要,因为具有salt和hash值的数据库可能会被盗 . 最后,密码哈希也可能是 memory-hard ,因此需要大量内存来计算哈希值 . 这使得无法使用特殊硬件(GPU 's, ASIC',FPGA等)来允许攻击者加速搜索 . 其他输入或配置选项(例如辣椒或并行化量)也可用于密码散列 .

    但是,即使 H(X) 是密码哈希,它仍然允许任何人验证给定的密码 H(X) . 密码哈希仍然是确定性的,因此如果有人知道所有输入和哈希算法本身,那么 X 可用于计算 H(X) 并且 - 再次 - 可以比较结果 .

    常用的密码哈希是 bcryptscryptPBKDF2 . 还有各种形式的 Argon2 ,这是最近的密码哈希竞赛的赢家 . Here on CrackStation是一篇关于做密码安全的好文章 .


    可能使攻击者无法执行哈希计算以验证密码是否正确 . 为此,胡椒可以用作密码哈希的输入 . 或者,散列值当然可以使用诸如AES的密码和诸如CBC或GCM的操作模式来加密 . 然而,这需要独立地存储秘密/密钥并且具有比密码散列更高的访问要求 .

  • 1

    还不可能将密码的哈希值放入算法中并以纯文本形式返回密码,因为哈希是一种单向的方式 . 但人们所做的是生成哈希并将其存储在一个大表中,这样当您输入特定哈希时,它会检查表中是否有与哈希匹配的密码并将该密码返回给您 . 这样做的网站的一个例子是http://www.md5online.org/ . 现代密码存储系统通过使用腌制算法来对此进行计数,这样当您在注册期间在密码框中输入相同的密码时,会生成不同的哈希值 .

  • 1

    不,你不能解密/反转md5,因为它是单向加密 . 但是有些网站有大量的密码数据库,所以你可以尝试在线解码你的MD5或SHA1哈希字符串 . 我尝试了website,如http://www.mycodemyway.com/encrypt-and-decrypt/md5,它的工作正常,但这完全取决于你的哈希,如果该哈希存储在该数据库,那么你可以得到实际的字符串 .

相关问题