Python内置模块—hashlib

加密算法介绍

Hash

  • 定义: 哈希,译作’散列’,就是把任意长度的输入(也叫映射),通过散列算法,变换成固定长度的输出,该输出就是散列值。这种转换是一种压缩映射,也就是,散列值的空间通常远小于输入的空间,不同的输入可能会散列成相同的输出(哈希碰撞),而不可能从散列值来唯一地确定输入值。
  • 哈希碰撞:一般来说,很多数据通过hashlib加密得到的数据是唯一的,但是当数据量特别大的时候,可能出现几千万个不同的数据加密后出现一两个相同的hash值的情况,但是概率非常小。这就称为hash碰撞。

MD5

  • 什么是MD5算法:MD5讯息摘要演算法(Message-Digest Algorithm),一种被广泛应用的密码杂凑函数,可以产生出一个128位数的哈希值(hash value),用于确保信息传输完全一致。MD5的前身是MD2,MD3,MD4。
  • MD5功能:
    • 输入任意长度的信息,经过处理,输出为128位的信息(数字指纹);
    • 不同的输入得到不同的结果(唯一性)。
  • MD5算法特点:
    • 压缩性:任意长度的数据,算出的MD5的值的长度都是固定的。
    • 容易计算:从原数据计算出MD5的值很容易。
    • 抗修改性:对原数据进行任何一点改动,生成新的MD5的值千差万别。
    • 强抗碰撞:已知原数据和MD5,想找到一个具有相同的MD5值的数据(即伪造数据)是非常困难的。
    • 不可逆:原因是它是一种哈希函数,使用hash算法,在计算过程中原文的部分信息是丢失了的。
  • MD5用途:
    • 防止被篡改:比如发送一个电子文档,发送前,我先得到MD5的输出结果a,然后在对方接受到电子文档后,对方也得到一个MD5的输出结果b。若a==b则表示途中未被篡改。比如我提供文件下载,为了防止不法分子在安装程序中添加木马,我可以在网站上公布由安装文件得到的MD5输出结果。SVN在检测文件是否在CheckOut后被篡改过,也是用到了MD5。
    • 防止直接看到明文:现在很多网站在数据库存储用户的密码的时候都是存储用户密码的MD5值。这样就算不法分 子得到数据库的用户密码的MD5值,也无法知道用户的密码。比如在Unix系统中用户的密码就是MD5值(获取他类似的算法)经加密后存储在文件系统中。当用户登陆的时候,系统把用户输入的密码计算成MD5值,然后再去和保存在文件系统中的MD5值进行比较,进而确定输入的密码是否正确。通过这样的步骤,系统在不知道用户密码的明码的情况下就可以确定用户登陆系统的合法性。这不但可以避免用户的密码 被具有系统管理员权限的用户知道,而且还在一定程度上增加了密码被破解的难度。
    • 防止抵赖(数字签名):这需要一个第三方认证机构。如A写了一个文件,认证机构对此文件用MD5算法产生摘要信 息并做好记 录。若以后A说这文件不是他写的,权威机构只需对此文件重新产生摘要信息,然后跟记录在册的摘要 信息进行对比,相同的话,就证明是A写的。这就是所谓的数字签名。

SHA

  • 定义:安全哈希算法(Secure Hash Algorithm)主要适应于数字签名标准(Digital Signature Standard DSS)里面定义的数字签名算法(Digital Signature Algorithm DSA)。对于长度小于2^64位的消息,SHA-1会产生一个160位的消息摘要。当接收到消息的时候,这个消息摘要可以用来验证数据的完整性。SHA是美国国家安全局设计的,由美国国家标准和技术研究院发布的一系列密码哈希函数。
  • 发展:由于MD5和SHA-1于2005年被山东大学教授王小云破解了,科学家们又推出了SHA-224,SHA-256,SHA-384,SHA-512,当然位数越长,破解难度越大,但同时生成加密的信息摘要所耗时间也更长。目前最流行的加密算法是SHA-256。

MD5和SHA-1比较

  • 由于MD5和SHA-1均是从MD4发展来的,它们的结构和强度等特性有很多相似之处,SHA-1和MD5的最大区别在于其摘要比MD5摘要长32比特。
  • 对于强行攻击,产生一个任何一个报文使之摘要等于给定 报文摘要的难度:MD5是2128数量级的操作,SHA-1是2160数量级的操作。
  • 对于强行攻击,产生具有相同摘要的两个报文的难度:MD5是264数量级的操作,SHA-1是280数量级的操作。因为SHA-1对强行攻击的强度更大。但由于SHA-1的循环部署比MD5多64位且需要处理的缓存大128比特,SHA-1的运行速度比MD5慢。

语法

MD5

  • md5 = hashlib.md5(): 生成md5序列
  • md5.update(data): 对data进行md5加密
  • md5.hexdigest(): 返回加密后的字符串
m0 = hashlib.md5()
m0.update(b'Hello,') 
print(m0.hexdigest()) # 70febc419840ffab3c91c81e9134e375
m0.update('恕瑞玛!'.encode('utf-8'))
print(m0.hexdigest()) # 5b9a83252d755a32352127ad191b9ce9

m1 = hashlib.md5()
m1.update('Hello, 恕瑞玛!'.encode('utf-8'))
print(m1.hexdigest()) # 5b9a83252d755a32352127ad191b9ce9

print(m0.hexdigest() == m1.hexdigest())	# True, 结果相同

SHA

  • sha = hashlib.shax():生成shax序列,其中x表示具体的sha算法,如sha1()sha256()
  • sha.update(data):对data进行sha加密
  • sha.hexdigest():返回加密后的字符串
  • sha1示例:3c198519940205b2a5b8d20274c52d85ada69b02
  • sha256示例:b6ead417d853adb502a3ac3bd30aab0bb46e1e2f12639fd778b4c95af21d7424

最佳实践

1.用户注册时,对用户通过表单传过来的password进行sha1加密处理后,存入数据库中:

# flask获取表单参数
username = request.json['username']
password = request.json['password']
# 对passowrd加密
password_sha = hashlib.sha1(password.encode("utf-8")).hexdigest()
# 插入到数据库
db.session.add(User(
	username=username,
    password=password_sha
))
db.session.commit()
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值