hash - 是否可以解密 MD5 哈希?

标签 hash cryptography md5 encryption

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

  • 从其他系统检索 MD5 加密密码;
  • 解密加密的密码和
  • 使用系统自己的算法将密码存储在系统的数据库中。

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

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

    最佳答案

    不。MD5 不是加密(尽管它可能用作某些加密算法的一部分),它是一种单向 hash function 。许多原始数据实际上作为转换的一部分“丢失”了。

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

    (非常不安全的)散列函数的一个简单示例(这说明了它是单向的一般思想)是获取一段数据的所有位,并将其视为一个大数。接下来,使用一些大(可能是素数)数 n 执行整数除法并取余数(参见: Modulus )。你会得到一些介于 0 和 n 之间的数字。如果您再次执行相同的计算(任何时间、任何计算机、任何地方),使用完全相同的字符串,它将得出相同的值。然而,没有办法找出原始值是多少,因为当除以 n 时,有无数个具有精确余数的数字。

    也就是说,已经发现 MD5 有一些弱点,例如通过一些复杂的数学运算,可能可以在不尝试 2128 个可能的输入字符串的情况下找到碰撞。大多数密码都很短,而且人们经常使用通用值(如“密码”或“ secret ”)这一事实意味着在某些情况下,您可以通过谷歌搜索哈希值或使用 Rainbow table 对某人的密码进行合理猜测.这就是为什么你应该总是“salt”散列密码的原因之一,这样两个相同的值在散列时不会散列到相同的值。

    一旦通过哈希函数运行了一段数据,就没有回头路了。

    关于hash - 是否可以解密 MD5 哈希?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1471654/

    相关文章:

    java - 处理通用键的哈希函数

    jquery - 使用 URL 哈希和 jQuery 处理单页网站并维护状态

    java - 如何RSA验证在php中生成的java中的签名

    Java:通过套接字发送后公钥不同

    C# 版本的 OpenSSL EVP_BytesToKey 方法?

    MySQL 从 md5 密码中删除字符

    ruby-on-rails - Rails 试图访问模型中的参数

    Android key 哈希和 Facebook 登录

    javascript - 如何使用 AES-GCM C#.NET 加密() 然后 JS WebCryptoApi 解密()?

    javascript - 在发送到 php 页面之前,我可以在 javascript 中将密码转换为 md5 吗?