
前言开发中经常遇到加密需求接口签名、密码摘要、文件校验、数据防篡改等场景SHA 系列哈希算法使用极其广泛。很多新手容易混淆几个常见误区SHA 不是加密是哈希摘要算法不可逆无法解密直接对中文字符串加密经常出现报错分不清 SHA1、SHA256、SHA512 使用场景不知道加盐哈希该如何实现。本文基于 Python 内置hashlib库无需额外安装第三方包完整演示各类 SHA 哈希实现附带常见踩坑解决方案。环境说明Python3.6 原生支持Windows / Linux / Mac 通用。一、基础概念区分SHASecure Hash Algorithm安全哈希算法SHA1输出160位40位十六进制字符串安全性较弱新项目不推荐SHA256输出256位64位十六进制目前业务最常用SHA512输出512位128位十六进制安全性更高重要特性单向不可逆只能生成摘要不能反向还原原始内容雪崩效应原始内容微小改动摘要完全不同相同输入一定得到相同摘要注意哈希 ≠ 加密。加密可以解密哈希无法解密。二、基础环境内置 hashlib不需要pip installPython 自带importhashlib三、最简单示例字符串 SHA256 摘要⚠️ 关键点hashlib 只支持 bytes 字节流字符串必须先.encode()推荐编码utf-8。importhashlibdefget_sha256(text:str)-str:# 1. 字符串转字节datatext.encode(utf-8)# 2. 创建sha256对象sha_objhashlib.sha256(data)# 3. 获取十六进制摘要resultsha_obj.hexdigest()returnresultif__name____main__:contenthello worldresget_sha256(content)print(SHA256摘要,res)输出结果SHA256摘要 b94d27b9934d3e08a52e52d7da7dabfac484efe37a5380ee9088f7ace2efcde9四、SHA1、SHA512 通用写法只需要更换hashlib.sha1()、hashlib.sha512()importhashlib text测试文本123datatext.encode(utf-8)sha1_reshashlib.sha1(data).hexdigest()sha256_reshashlib.sha256(data).hexdigest()sha512_reshashlib.sha512(data).hexdigest()print(SHA1:,sha1_res)print(SHA256:,sha256_res)print(SHA512:,sha512_res)五、进阶分段大文件 SHA 哈希适合校验文件完整性如果文件很大一次性读取全部内容占用内存采用分段更新update()。importhashlibdefget_file_sha256(file_path:str,chunk_size4096)-str:sha_objhashlib.sha256()withopen(file_path,rb)asf:whilechunk:f.read(chunk_size):sha_obj.update(chunk)returnsha_obj.hexdigest()# 使用# print(get_file_sha256(test.zip))六、业务常用加盐 SHA 摘要直接 SHA 存在彩虹表碰撞风险存储密码、接口签名建议加盐。两种主流方式importhashlibdefget_sha256_salt(text:str,salt:strmy_secret_2026)-str:# 方式1原始内容 盐拼接rawtextsaltreturnhashlib.sha256(raw.encode(utf-8)).hexdigest()# 推荐盐放在前后都可以前后位置保持和服务端一致即可print(get_sha256_salt(123456))重要提醒加盐规则前后端必须完全统一拼接顺序、编码不一致会导致摘要不匹配。七、digest() 与 hexdigest() 区别很多新手分不清这两个方法.hexdigest()返回十六进制字符串日常接口、日志打印首选.digest()返回原始二进制字节串一般极少直接使用。datademo.encode(utf-8)print(hashlib.sha256(data).hexdigest())# 字符串print(hashlib.sha256(data).digest())# bytes八、高频踩坑清单坑1中文不编码直接加密抛异常# 错误写法# hashlib.sha256(中文)# TypeError: Unicode-objects must be encoded before hashing# 正确必须encodehashlib.sha256(中文.encode(utf-8))坑2编码不一致导致摘要不同同一文本一方 utf-8一方 gbk算出的 sha256 完全不一样。项目统一约定全部使用 utf-8。坑3SHA1 安全性不足SHA1 已被证明存在碰撞漏洞新项目禁止使用 SHA1 做签名、密码存储优先 SHA256。坑4哈希用来存储密码不推荐单纯 SHA256简单盐依然不安全。用户密码存储推荐使用bcrypt/passlib内置多次迭代加盐。SHA 更适合接口签名、文件校验场景。坑5空格、换行、不可见字符引发摘要不一致网络传输时注意去除首尾多余空格保证参与哈希的原始文本完全一致。九、封装通用工具类可直接放入项目importhashlibclassHashUtil:staticmethoddefsha1(text:str,encodingutf-8)-str:returnhashlib.sha1(text.encode(encoding)).hexdigest()staticmethoddefsha256(text:str,encodingutf-8)-str:returnhashlib.sha256(text.encode(encoding)).hexdigest()staticmethoddefsha512(text:str,encodingutf-8)-str:returnhashlib.sha512(text.encode(encoding)).hexdigest()staticmethoddefsha256_salt(text:str,salt:str,encodingutf-8)-str:contenttextsaltreturnhashlib.sha256(content.encode(encoding)).hexdigest()if__name____main__:print(HashUtil.sha256(hello python))十、常见业务场景选型建议接口请求签名SHA256 自定义盐前后端约定拼接规则文件完整性校验SHA256 / SHA512日志数据摘要标识SHA256旧系统兼容SHA1新项目尽量规避总结Python 使用内置hashlib实现 SHA 系列哈希无需第三方库字符串必须 encode 转为字节统一使用 utf-8hexdigest()获取可读十六进制字符串开发最常用SHA 是单向哈希算法不可逆不要当作加密算法对外接口签名务必加盐增加破解难度新项目优先 SHA256淘汰 SHA1。