MD5加密算法是单向加密算法,我们无法对加密后的值进行计算以得出原始数据。这是因为MD5采用了散列哈希函数,在计算过程中,部分数据信息是丢失的,从源数据计算出MD5很容易,但是逆向时,一个MD5值会对应多个源数据。所以,伪造数据是很困难的。
一般情况下,不同的原始数据计算得到的MD5是不同的,但是也可能会相同(被称为Hash碰撞),这是一个小概率事件。(后面我们可以采用多种单向加密算法对同一个文件进行加密的方法来进一步减小这个概率)
MD5算法的基本原理是先将原始数据进行填充处理为512位的整数倍的数据,然后以每512位为一组进行循环计算,将前一组得到的128bit的MD5值作为下一个分组的参数进行计算。循环计算最终得到的128bit的值就是最终的MD5值。
代码实现也很简单,我下面的代码给出了加密字符串以及加密文件的方法
import hashlib
message = '哈哈哈哈哈哈嘻嘻'
MD5 = hashlib.md5(message.encode())
print('%s md5加密结果是:%s' % (message, MD5.hexdigest()))
with open('15.2.1.py', 'rb') as f:
m = hashlib.md5(f.read())
print(m.hexdigest())
然后,我们就可以使用md5来匹配用户密码是否正确
import hashlib
class User:
def __init__(self, username, password):
self.username = username
md5 = hashlib.md5(password.encode())
self.password = md5.hexdigest()
def check_password(self, password):
md5 = hashlib.md5(password.encode())
if md5.hexdigest() == self.password:
return '密码正确'
else:
return '密码错误'
user = User('xiaoming', '123456')
print('加密后的密码:', user.password)
print(user.check_password('123456'))
print(user.check_password('12345678'))
虽然MD5的加密结果不可逆,但是我们要知道,有句话叫做“枚举出真知”。破解者可以通过枚举的方法找到密码及其对应的MD5的值。
我们不仅需要考虑MD5再存储的时候的安全性,也要考虑如何使加密过程更加安全。比如最简单的操作就是把MD5再进行一次MD5加密或者用其他加密方法进行处理,这样即使数据泄露,也会加大破解者的破解难度和时间。
import hashlib
def md5(content):
return hashlib.md5(content.encode()).hexdigest()
message = '哈哈哈'
print('一次加密得到的md5:', md5(message))
print('两次加密得到的md5', md5(md5(message)))