【1】摘要算法和加密算法的
(1)摘要算法
- 定义
- 摘要算法是一种将任意长度的数据映射为固定长度摘要(哈希值)的算法
- 常见的摘要算有MD5、SHA1、SHA-256等
- 输出的摘要长度固定,无论输入数据长度是多长,输出摘要长度都固定
- 特点
- 不可逆性:无法通过摘要反推得到原始数据
- 唯一性:每一个数据数据都对应唯一的输出摘要
- 固定长度:无论输入数据长度,输出摘要长度固定
- 应用场景
- 数据完整性验证:验证数据在传输过程中是否被篡改
- 密码存储:存储密码的哈希值,避免存储明文数据
- 数字签名:验证数据的真实性和完整性
(2)加密算法
- 定义
- 加密算法是一种将原始数据(明文)转换成密文的算法,使用密码进行加密和解密
- 常见的加密算法有对称加密算法(如AES、DES)和非对称加密算法(如RSA)
- 特点
- 可逆性:加密和解密是可逆的,使用正确的密钥可以还原原始数据
- 使用密码:加密和解密需要使用密钥,对称加密使用相同密钥,非对称加密使用公钥和私钥、
- 应用场景
- 保密性:保护数据机密,确保只有授权的人能够解密和访问数据
- 安全通信:在网络通信中使用加密算法保护数据传输的安全性
- 数字签名:非堆成密钥用于生成和验证数字签名
【2】halshlib摘要算法模块
(1)MD5
hexdigest()
返回一个表示摘要值的十六进制字符串,更适合人类阅读。digest()
返回一个包含原始摘要值的字节对象,适合在二进制形式下进行处理,如存储或传输。
import hashlib
md5 = hashlib.md5()
data = "Peace and love"
data = data.encode("utf8")
md5.update(data)
print(md5.hexdigest())
print(md5.digest())
(2)多次传值
import hashlib
md5 = hashlib.md5()
data = "Peace and love"
data = data.encode("utf8")
md5.update(data)
print(md5.hexdigest())
md5 = hashlib.md5()
md5.update(b"Peace")
md5.update(b" ")
md5.update(b"and")
md5.update(b" ")
md5.update(b"love")
print(md5.hexdigest())
(3)MD5破解方法(撞库)
import hashlib
object_code = "8f26358657e4635f9876bc6c2ebfa8d5"
already_library = [
"123456",
"789456",
"love",
"Peace"
]
def crack_code(object_code, already_library):
md5 = hashlib.md5()
for code in already_library:
code = code.encode("utf8")
md5.update(code)
if object_code == md5.hexdigest():
print(f"解密成功,密码是{code.decode('utf8')}")
return
print("解密失败,已知库太小")
crack_code(object_code, already_library)
(4)密码加盐
import hashlib
def encrypt(data):
data = "peace" + str(data) + "love"
data = data.encode("utf8")
md5 = hashlib.md5()
md5.update(data)
return md5.hexdigest()
print(encrypt(b"123456"))
【3】应用(登陆注册)
import hashlib
import json
import random
import string
def read_data():
with open("user_dict.json", "r", encoding="utf8") as fp:
data = json.load(fp=fp)
return data
def save_data(user_dict):
with open("user_dict.json", 'w', encoding="utf8") as fp:
json.dump(user_dict, fp=fp, ensure_ascii=False)
def encrypt(data, salt):
data = data.encode("utf8")
md5 = hashlib.md5()
md5.update(data)
res = md5.hexdigest()
res += str(salt)
return res
def get_n_captcha(n=4):
choice_list = list(string.digits + string.ascii_lowercase)
captcha_list = random.choices(choice_list, k=n)
captcha = "".join(captcha_list)
return captcha
def register():
username = input("username>>>:").strip()
password = input("password>>>:").strip()
captcha = get_n_captcha(4)
captcha_input = input(f"captcha[{captcha}]>>>:")
if captcha_input != captcha:
print("captcha wrong")
return
password = encrypt(password, captcha)
user_dict = {"username": username, "password": password}
save_data(user_dict)
print("register successful")
def login():
username = input("username>>>:").strip()
password = input("password>>>:").strip()
user_dict = read_data()
salt = user_dict["password"][-4:]
password = encrypt(password, salt)
if username == user_dict["username"] and password == user_dict["password"]:
print("login successful")
return
print("username or password wrong")
register()
login()