有人告诉我,他看到过软件系统:
- 从其他系统中检索MD5加密密码;
- 解密加密的密码并且
- 使用该系统自己的算法将密码存储在系统数据库中。
这种情况可能吗? 我原以为无法解密MD5哈希。
我知道有MD5字典,但是否存在实际的解密算法呢?
有人告诉我,他看到过软件系统:
这种情况可能吗? 我原以为无法解密MD5哈希。
我知道有MD5字典,但是否存在实际的解密算法呢?
不,MD5不是加密(尽管它可能作为某些加密算法的一部分),它是单向哈希函数。在转换的过程中,实际上会丢失原始数据的大部分信息。
想象一下:一个MD5值总是由128个比特位组成。这意味着有2128种可能的MD5哈希值。虽然这是一个相当大的数字,但肯定是有限的。而且,对于给定的哈希函数来说,有无数个可能的输入(大多数包含超过128比特位或仅仅16字节的微不足道数据)。因此,实际上有无限多的数据可以映射到相同的哈希值。哈希函数的有趣之处在于,要找到两个具有相同哈希值的数据非常困难,而且碰巧发生的几率几乎为零。
一个简单的例子是一个(非常不安全的)哈希函数(这说明了单向哈希的一般思想):将所有数据的比特位全部取出,将其视为一个大数字。接下来,使用一些大的(可能是质数)数字n进行整数除法,并取余数(请参见:模算术)。这样将得到0到n之间的某个数字。如果你再次执行相同的计算(任何时间、任何地方的任何计算机),使用完全相同的字符串,将得到相同的值。但是,没有办法找出原始值是什么,因为有无限多的数字在除以n的时候都会产生相同的余数。
尽管如此,MD5算法被发现存在一些弱点,使用一些复杂的数学方法可能会在不尝试2128个可能的输入字符串的情况下找到碰撞。而且,由于大多数密码长度很短,人们经常使用常见值(例如“password”或“secret”),这意味着在某些情况下,通过搜索哈希或使用Rainbow表,你可以对某人的密码进行合理的猜测。这就是为什么你应该始终为已哈希的密码“加盐”,以便两个相同的值在哈希后将不会哈希成相同的值的一个原因。
一旦数据经过哈希函数处理,就无法逆转。
从技术上讲,这是“可能的”,但需要在非常严格的条件下(彩虹表,基于用户密码在哈希数据库中的非常小的可能性进行暴力破解)。
但这并不意味着它是
你不想“反向”MD5哈希。使用下面概述的方法,你永远不需要这样做。“反向”MD5实际上被认为是恶意的——一些网站提供“破解”和暴力破解MD5哈希的能力——但它们只是包含字典单词、以前提交的密码和其他单词的大型数据库。它有非常小的机会拥有你需要反转的MD5哈希。如果你已经加盐了MD5哈希——这也行不通!:)
使用MD5哈希的登录方式应该是这样的:
注册期间:
用户创建密码 -> 密码使用MD5进行哈希 -> 哈希存储在数据库中
登录期间:
用户输入用户名和密码 -> (检查用户名)密码使用MD5进行哈希 -> 将哈希与数据库中存储的哈希进行比较
当需要“忘记密码”时:
2个选项:
或者
不可能,在合理的时间内不可能。
通常处理方式是进行密码“重置”。也就是说,您会为其生成新的(随机的)密码并通过电子邮件发送给他们。
无论使用什么语言,你都无法恢复一个MD5密码。
但是你可以:
为用户提供一个新的密码。
在彩虹表中检查以尝试检索旧密码。
不,他一定是对MD5字典混淆了。
密码哈希 (如MD5等) 是单向的,只有摘要信息是无法还原为原始消息的,除非你拥有关于原始消息的其他信息等。
但这需要保密,否则会导致安全风险。
MD5是一种哈希算法,你不能还原哈希值。
你应该添加“修改密码功能”,用户提供另一个密码,计算哈希并将其存储为新密码。
这并不是一件容易的事情,这也是首次对密码进行哈希处理的原因 :)
你应该能够做的一件事情是为他们手动设置一个临时密码并将其发送给他们。
我犹豫要不要提及这个方法,因为这是一个不好的想法(而且也不能保证一定有效),但你可以尝试像milw0rm这样的彩虹表中查找哈希值,以此来恢复旧密码。