python模块hashlib & hmac
2024-09-03 08:51:32
Hash,译做“散列”,也有直接音译为“哈希”的。把任意长度的输入,通过某种hash算法,变换成固定长度的输出,该输出就是散列值,也称摘要值。该算法就是哈希函数,也称摘要函数。
MD5是最常见的摘要算法,速度很快,生成结果是固定的16字节,通常用一个32位的16进制字符串表示。SHA1算法更安全点,它的结果是20字节长度,通常用一个40位的16进制字符串表示。而比SHA1更安全的算法是SHA256和SHA512等等,不过越安全的算法越慢,并且摘要长度更长。
两个模块主要用于加密相关的操作(加密数据时一定要指定数据编码格式。可以使用字符串前b' '的方法或使用.encode('UTF-8')的方法,使字符串变为bytes类型)
hashlib模块
md5
import hashlib
ha_m5 = hashlib.md5()#创建对象
ha_m5.update('abc'.encode(encoding='utf-8'))#添加对象时需要指定编码
print(ha_m5.digest())#以二进制格式显示加密信息
print(ha_m5.hexdigest())#以十六进制格式显示加密信息(常用)
应用实例:
def md5_lower_32(dic,secret):
"""
接口的鉴权方法
把参数字典中value非空的键值对按顺序进行拼接后,再加上密钥secret进行MD5得到sign
"""
lis = dic.items()
lis = sorted(lis,reverse=False)
key_value = []
for key,value in lis:
if value:
if type(value) is int:
value = str(value)
elif type(value) is not str:
continue
elif key == 'sign':
continue
s = key+'='+value
key_value.append(s)
key_value.append('secret=%s'%secret)
string = '&'.join(key_value)
print(string)
md = hashlib.md5()
md.update(string.encode(encoding='utf-8'))
ret = md.hexdigest()#以十六进制格式显示加密信息(常用),md.digest()是以二进制格式显示加密信息
return ret
sha1(sha224 sha256 sha384 sha512等不作赘述)
ha_s1 = hashlib.sha1()
ha_s1.update('abc'.encode(encoding='utf-8'))
print(ha_s1.digest())#以二进制格式显示加密信息
print(ha_s1.hexdigest())#以十六进制格式显示加密信息
hmac模块
sha1(方法支持加盐)
import hmac
key = b'salt'
data = b'sjdhjwkdjk'
hm = hmac.new(key,data,hashlib.sha1)
hm.digest()#以二进制格式显示加密信息
hm.hexdigest()#以十六进制格式显示加密信息
应用实例:
import hmac,base64
def sha1_base64(key,data):
data_sha1 = hmac.new(key,data,hashlib.sha1).digest()
data_sha1_base64 = base64.b64encode(data_sha1)
return data_sha1_base64
以下代码是对应的php写法,当时用python实现是为了测试开发人员的接口实现的正确性
base64_encode(hash_hmac("sha1", QUERY_STRING, KEY, TRUE))
ps:有个搞不明白的地方在此记录,以上实际使用时,hmac模块的sha1加密算法得到的值,通过hashlib模块没法得到
研究hashlib底层代码没看懂如何加盐即key,试着用如下方法,得到的结果不对~
key = b'salt'
data = b'sjdhjwkdjk'
hm = hmac.new(key,data,hashlib.sha1)
res1 = hm.digest() ha_s1 = hashlib.sha1(key)
ha_s1.update(data)
res2 = ha_s1.digest() res1和res2不相等
最新文章
- ABP模块化
- assets 加载资源文件
- 开发工具&;环境
- java查看当前项目所有线程列表界面
- 复制本贴地址传给QQ/MSN好友的代码
- ios页面传值的几种方法
- O-C浮点数转化整数
- windows本地搭建grunt前端项目构建环境
- C# DateTime结构的常用方法
- UIButton根据不同的状态设置layer
- 怎样做才是最优雅方式切换 web 项目数据源 ?
- C++获取Windows7 32位系统中所有进程名(类似于任务管理器中的进程)
- Razor视图
- PHP之cookies小练习
- Android内存管理篇 - adj的概念与进程adj级别控制
- adb shell dumpsys meminfo [packagename] 输出内容的含义
- BZOJ1395 : [Baltic2005]Trip
- sql server中调用c#写的dll里的方法
- spring security 注解@EnableGlobalMethodSecurity详解
- 巧用style的另类写法
热门文章
- Python数学常量
- 小程序对于华为Oppo的canvas二维码渲染数据量大
- BZOJ 5267 特工 (类FWT)
- smarty中ifelse、foreach以及获取数组中键值名的一个实例
- 【黑马JavaSE】1_1_11_IDEA、12_方法、13_重载
- 尚学堂requireJs课程---3、私有和公有属性和方法
- websphere部署不能发布war文件,提示“配置库中已存在应用程序
- Spring Bean学习创建及使用<;二>;
- 阶段3 3.SpringMVC&#183;_06.异常处理及拦截器_3 SpringMVC异常处理之异常处理代码编写
- 关于ckeditor粘贴图片自动上传