hashlib

尐少發表於2024-11-18
# hash
# hash() 將資料轉換成一個數字的演算法
"""在同一次執行過程中,對同一個可hash的值進行計算得到的值是相同的,類似記憶體地址"""
print(hash('123')) # 6690882297275263703
print(hash("123")) # 6690882297275263703
a = '123'
b = '123'
print(hash(a)) # 6690882297275263703
print(hash(b))# 6690882297275263703  a、b hash值相同

import hashlib
# hashlib
"""
1、提供多種演算法: 相同資料用相同演算法計算結果相同:
hashlib.md5()  可被撞庫、暴力破解,定長32位16進位制
hashlib.sha1()  sha演算法集數字越大計算量越大,越安全
2、只能加密,不可逆進行解密;
3、演算法傳參只能接受bytes型別;
"""
md5_obj1 = hashlib.md5()
md5_obj1.update(b'abc') # 注意傳參是bytes型別
print(md5_obj1.hexdigest()) # 900150983cd24fb0d6963f7d28e17f72

md5_obj2 = hashlib.md5('key'.encode('utf8') # 加鹽,字串可以是任意簽名
md5_obj2.update(b'abc')
print(md5_obj2.hexdigest()) # 52878f125814206651a24111280ec873

# 示例
def login(u_name, u_pwd):
    key = u_name # 動態加鹽,提高安全性
    md5_pwd = hashlib.md5(key.encode('utf8))
    md5_pwd.update(u_pwd)
    md5_pwd_str = md5_pwd.hexigest()
    with open('user_info.txt') as f:
        for line in f:
            name, pwd = line.split(',')
            if name.strip() == u_name and pwd.strip() == md5_pwd_str:
                print('登入成功')
                break

login('王五', 'abc')

#對比檔案md5值,可用於校驗檔案一致性
def calculate_hash(file_path):
    with open(file_path) as f:
        md5_obj3 = hashlib.md5()
        file_size = os.path.getsize(file_path)
        while file_size > 0:
            context = f.read(1024) # 大檔案分批讀取
            md5_obj3.update(context.encode('utf8')) # hashlib.md5 支援多段資料更新
            file_size -= 1024
        return md5_obj3.hexdigest() # 檔案的hash值改變說明檔案有改動

f1 = 'user_info.txt'
print(calculate_hash(f1))
user_info.txt
張三,52878f125814206651a24111280ec873
李四,52878f125814206651a24111280ec873
王五,f8e8f25285b9f61b56bdf7bd5c2c8f9f