一、MD5反查基礎概念
MD5(Message-Digest Algorithm 5)是一種常用的哈希演算法,它將不同長度的信息通過哈希運算,輸出定長的哈希值。反查就是通過這個哈希值,找到原來的信息。
MD5的哈希值是一個128位的二進位數,通常用32位的16進位數表示。在應用中,MD5通常用於文件校驗、數據校驗、口令加密等。
用Python基礎庫中的hashlib模塊可以很容易地實現MD5哈希值的計算:
import hashlib
text = 'hello world'
md5 = hashlib.md5(text.encode()).hexdigest()
print(md5) # 輸出5eb63bbbe01eeed093cb22bb8f5acdc3
二、MD5反查實現
當我們拿到一個MD5哈希值時,如果要進行反查,就需要用一個字典來存儲哈希值與原文的映射關係。字典中的鍵為哈希值,值為原文。
這裡以破解一個網站用戶密碼的例子來說明MD5反查的實現。假設我們得到了一個資料庫文件,其中存儲了用戶的用戶名和密碼的MD5哈希值:
users = [
{'username': 'user1', 'password_md5': '5f4dcc3b5aa765d61d8327deb882cf99'},
{'username': 'user2', 'password_md5': '202cb962ac59075b964b07152d234b70'},
{'username': 'user3', 'password_md5': 'e10adc3949ba59abbe56e057f20f883e'},
{'username': 'user4', 'password_md5': '81dc9bdb52d04dc20036dbd8313ed055'}
]
我們可以先通過字典攻擊的方式生成一個含有常用密碼的字典文件,然後遍歷用戶數據進行反查。
下面是字典攻擊生成字典文件的代碼:
import itertools
def generate_password_dict(length=6):
chars = 'abcdefghijklmnopqrstuvwxyz'
passwords = itertools.product(chars, repeat=length)
with open('password.txt', 'w') as f:
for password in passwords:
f.write(''.join(password)+'\n')
我們可以將密碼的長度設置為6位,然後在a~z的字母中生成所有組合,最後將這些密碼保存在一個文本文件中。
反查的代碼如下:
import hashlib
with open('password.txt', 'r') as f:
passwords = [p.strip() for p in f]
for user in users:
for password in passwords:
if hashlib.md5(password.encode()).hexdigest() == user['password_md5']:
print('{}:{}'.format(user['username'], password))
在這條代碼中,我們首先讀取生成的密碼字典文件,然後遍歷所有用戶和密碼的組合,計算哈希值並與原始密碼比較,如果匹配成功,輸出用戶名和密碼。
三、MD5反查的應用場景
MD5反查演算法廣泛應用於數據安全領域。比如:
- 破解密碼:在拿到資料庫文件後,可以通過MD5反查演算法破解用戶密碼。
- 數據完整性校驗:伺服器可以將接收到的數據計算MD5哈希值,然後與客戶端發來的哈希值比較,來校驗數據的完整性。
- 數字簽名:數字簽名是一種安全性很高的文件驗真方式,它採用的就是哈希演算法,將文件的哈希值(數字簽名)與信任機構(CA)頒發的數字證書相對比,從而證實文件是未被篡改過的。
原創文章,作者:SHQOS,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/332283.html