大家好,又见面了,我是你们的朋友全栈君。
hash是一种算法(不同的hash算法只是复杂度不一样)(3.x里代替了md5模块和sha模块,主要提供 SHA1, SHA224, SHA256, SHA384, SHA512 ,MD5 算法),该算法接受传入的内容,经过运算得到一串hash值
基于 1 和 3 可以做文件下载一致性的校验 基于 1 和 2 可以对用户密码进行加密
hash 算法就像一座工厂,工厂接收你送来的原材料,经过加工返回的产品就是hash值
import hashlib
obj = hashlib.md5() # 构造一个hashlib的对象
obj.update("小马过河") # update对指定字符串进行加密
print(obj)
TypeError: Unicode-objects must be encoded before hashing
import hashlib
obj = hashlib.md5() # 构造一个hashlib的对象
obj.update("小马过河".encode(encoding='utf-8')) # update对指定字符串进行加密
print(obj)
<md5 HASH object @ 0x000001C696DEF8F0>
import hashlib
obj = hashlib.md5() # 构造一个hashlib的对象
obj.update("小马过河".encode(encoding='utf-8')) # update对指定字符串进行加密
result=obj.hexdigest()
print(result) # 24f67b0f6d02adc8867d612e0e0fc40a
import hashlib
obj = hashlib.md5("mcw@xiaoma@aaaafffff".encode("utf-8")) # 添加一些内容,提高加密复杂度,此处的字符串也要先编码
obj.update("小马过河".encode(encoding='utf-8')) # update对指定字符串进行加密
result = obj.hexdigest()
print(result) # b11740508f28e04837f2c0e3a58cf990
import hashlib
def get_md5(data): # 传参为需要加密的字符串
obj = hashlib.md5("sidrsicxwersdfsaersdfsdfresdy54436jgfdsjdxff123ad".encode('utf-8'))
obj.update(data.encode('utf-8'))
result = obj.hexdigest()
return result
val = get_md5('123')
print(val) # 35093270b6352fa9721370b781f7b4d7
import hashlib
USER_LIST = []
def get_md5(data):
obj = hashlib.md5("12:;idrsicxwersdfsaersdfsdfresdy54436jgfdsjdxff123ad".encode('utf-8'))
obj.update(data.encode('utf-8'))
result = obj.hexdigest()
return result
def register():
print('**************用户注册**************')
while True:
user = input('请输入用户名:')
if user == 'N':
return
pwd = input('请输入密码:')
temp = {
'username': user, 'password': get_md5(pwd)}
USER_LIST.append(temp)
def login():
print('**************用户登陆**************')
user = input('请输入用户名:')
pwd = input('请输入密码:')
for item in USER_LIST:
if item['username'] == user and item['password'] == get_md5(pwd):
return True
if __name__ == '__main__':
register()
result = login()
if result:
print("登录成功")
else:
print("登陆失败")
**************用户注册**************
请输入用户名:>? ice
请输入密码:>? ice1314
请输入用户名:>? N
**************用户登陆**************
请输入用户名:>? ice
请输入密码:>? ice1314
登录成功
**************用户注册**************
请输入用户名:>? ice
请输入密码:>? ice1314
请输入用户名:>? N
**************用户登陆**************
请输入用户名:>? ice
请输入密码:>? ice520
登陆失败
hashlib
模块进行加密。如何保证下载的文件过程中不丢包,保证下载数据的完整性
r""" 文件一致校验 可以拷贝一个文件放在两个不同的盘中,然后通过判断两个文件的hash值是否相等,判断两个文件是否是同一个文件 """
import hashlib
m = hashlib.md5()
n = hashlib.md5()
with open(r'file1', 'rb') as f:
for line in f:
m.update(line)
print(m.hexdigest())
with open(r'file2', 'rb') as f:
for line in f:
n.update(line)
print(n.hexdigest())
r"""模拟撞库破解密码"""
import hashlib
passwords = [ # 可以通过random实现对passwords中的内容
'alex3714',
'alex1313',
'alex94139413',
'alex123456',
'123456alex',
'a123lex',
]
def make_passwd_dic(pwds): # 通过明文密码列表,造出与之对应的hash值得字典
dic = {
}
for password in pwds:
m = hashlib.md5() # 使用md5算法,造了一个工厂
m.update(password.encode('utf-8')) # 给工厂运送原材料(即我们要加密的内容)
dic[password] = m.hexdigest() # 产出hash值(即最终的产品),将其加入到我们事先造好的空字典中,字典形式:{密码:hash值}
return dic
def break_code(cryptograph, passwd_dic): # 判断拦截的hash值是否与字典中事先造好的hash值相等,相等则说明成功进行破解
for k, v in passwd_dic.items():
if v == cryptograph:
print('密码是===>\033[46m%s\033[0m' % k)
pwd = 'aee949757a2e698417463d47acac93df' # 我们拦截拿到的密码,经过加密的hash值
break_code(pwd, make_passwd_dic(passwords)) # 将要破解的密码hash值,和事先造好的hash的字典当做函数的实参传给对应的形参
与hashlib类似,好像是先加密一次,然后对加密的结果加前缀字符串,再用一个加密方法再次加密
r"""python 还有一个 hmac 模块,它内部对我们创建 key 和 内容 进行进一步的处理然后再加密"""
import hmac
h = hmac.new(key=b"secret", msg='天王盖地虎'.encode('utf8'), digestmod='MD5')
h.update('hello'.encode('utf8'))
print(h.hexdigest()) # db78538167de0b25b7fcd88bdcde3db9
r""" 要想保证hmac最终结果一致,必须保证: 1: hmac.new括号内指定的初始key一样 2: 无论update多少次,校验的内容累加到一起是一样的内容 下面单重方式得到的结果是一样的 """
h1 = hmac.new(key=b'tom', digestmod='MD5') # 初始值必须保证一致,最终得到的结果就会不一样
h1.update(b'hello')
h1.update(b'world')
print(h1.hexdigest()) # 0426ccec3b134e8c18fdcefee841ef25
h2 = hmac.new(key=b'tom', digestmod='MD5') # 初始值必须保证一致,最终得到的结果就会不一样
h2.update(b'helloworld')
print(h2.hexdigest()) # 0426ccec3b134e8c18fdcefee841ef25
h3 = hmac.new(key=b'tomhelloworld', digestmod='MD5') # 初始值不一样,所以与上面两种的结果不一样
print(h3.hexdigest()) # ff1214d895bbaf5f1847db4ebae8212e
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/133107.html原文链接:https://javaforall.cn