Python中hashlib模块

Python中hashlib模块

目录

1. 介绍hashlib

  hashlib 是一个提供了一些流行的hash算法的 Python 标准库.其中所包括的算法有 md5, sha1, sha224, sha256, sha384, sha512. 另外,模块中所定义的 new(name, string=”) 方法可通过指定系统所支持的hash算法来构造相应的hash对象.其实哈希算法有时也叫做签名算法,其实两者是相通的。要想使用本模块里的HASH功能,需要使用相应的构造函数,把对象创建出来,再调用相应的函数,比如使用SHA1算法,就需要先调用构造函数sha1()来创建一个对象,接着调用对象的update()函数,在这个函数里输入要计算的bytes对象,最后通过digest()或hexdigest()函数就可以获取相应的HASH值或摘要。

2. hashlib的使用

常用属性
hashlib.algorithms
列出所有加密算法


h.digest_size
产生的散列字节大小。


h.block_size
哈希内部块的大小


常用方法
hash.new([arg])
创建指定加密模式的hash对象


hash.update(arg)
更新哈希对象以字符串参数。如果同一个hash对象重复调用该方法,m.update(a); m.update(b) 等价于 m.update(a+b)


hash.digest()
返回摘要,作为二进制数据字符串值。


hash.hexdigest()
返回摘要,作为十六进制数据字符串值


hash.copy()
复制

a. 各hash算法的使用示例

import hashlib
from hashlib import md5
from hashlib import sha1
from hashlib import sha224
from hashlib import sha256
from hashlib import sha384
from hashlib import sha512

#__all__ = ('md5', 'sha1', 'sha224', 'sha256', 'sha384', 'sha512', 'new', 'algorithms_guaranteed', 'algorithms_available', 'pbkdf2_hmac')
#Python计算字符串的hash值
def hashForString(method,srcbyte):
    #将字符串和汉字转化成byte类型
    srcbyte = srcbyte.encode("utf-8")

    #new(name, data=b'')
    testnew = hashlib.new(method,data=srcbyte).hexdigest()
    print(testnew)

    if method == 'md5': 
        m = md5()
        m.update(srcbyte)
        srcbyte = m.hexdigest()
    elif method == 'sha1':
        s = sha1()
        s.update(srcbyte)
        srcbyte = s.hexdigest()
    elif method == 'sha224':
        s = sha224()
        s.update(srcbyte)
        srcbyte = s.hexdigest()
    elif method == 'sha256':
        s = sha256()
        s.update(srcbyte)
        srcbyte = s.hexdigest()
    elif method == 'sha384':
        s = sha384()
        s.update(srcbyte)
        srcbyte = s.hexdigest()
    elif method == 'sha512':
        s = sha512()
        s.update(srcbyte)
        srcbyte = s.hexdigest()
    return srcbyte

print (hashForString("md5","COMEN"))
from hashlib import md5
from hashlib import sha1
from hashlib import sha224
from hashlib import sha256
from hashlib import sha384
from hashlib import sha512
hash_funcs = [md5, sha1, sha224, sha256,sha384, sha512]

def hash_show(s):
    result = []
    for func in hash_funcs:
        s_hash_obj = func(s)
        s_hash_hex = s_hash_obj.hexdigest()
        result.append((s_hash_obj.name, s_hash_hex,  len(s_hash_hex)))
    return result


if __name__ == '__main__':
    s = 'hello python'
    rs = hash_show(s.encode("utf-8"))
    print(rs)

#执行结果
[('md5', 'e53024684c9be1dd3f6114ecc8bbdddc', 32), ('sha1', '1d1244e0f2efb8c94ec7a0814568216637b329ca', 40), ('sha224', '7f78ad20eff5afc21166e6a5e22962a2819bd28d335ba95ff414b3f5', 56), ('sha256', '373a23512f9531ad49ec6ad43ecdda58df01e59d9ec5812d601fd05cc53345d3', 64), ('sha384', 'eaf44aabb38c34ff948e714b9c3c08f3fed996d74fc9f1225d7368ccb386465df272e55912041921eddf13b51aff833c', 96), ('sha512', 'e8b430766d68a185db5de94b8cf811761db8dd875cf3baae24c6939b0111d19143da1c51294a2aff6adfb46f4687f78ffffa17f2189ca2c0a03a19d4d6bd0d8c', 128)]

b. 一个 md5 的使用示例

#!/usr/bin/python
import hashlib 

m1 = hashlib.md5()    # 构造hash对象
m1.update('hello'.encode("utf-8"));
m1.update(' '.encode("utf-8"))
m1.update('python'.encode("utf-8"))

m2 = hashlib.md5('hello python'.encode("utf-8"))

print (m1.hexdigest() == m2.hexdigest())    # 两种方式的效果相同

c. 使用 new(name, string=”) 构造新的哈系对象

import hashlib

h = hashlib.new('ripemd160', 'hello python'.encode('utf-8'))    # ripemd160是一个160位的hash算法. ripemd系列算法基于md4, md5.
print (h.hexdigest())

3. hashlib的特点

一个优秀的 hash 算法,将能实现:

正向快速:给定明文和 hash 算法,在有限时间和有限资源内能计算出 hash 值。
逆向困难:给定(若干) hash 值,在有限时间内很难(基本不可能)逆推出明文。
输入敏感:原始输入信息修改一点信息,产生的 hash 值看起来应该都有很大不同。
冲突避免:很难找到两段内容不同的明文,使得它们的 hash 值一致(发生冲突)。即对于任意两个不同的数据块,其hash值相同的可能性极小;对于一个给定的数据块,找到和它hash值相同的数据块极为困难。

4. hashlib中各hash函数的介绍

MD4(RFC 1320)是 MIT 的 Ronald L. Rivest 在 1990 年设计的,MD 是 Message Digest 的缩写。其输出为 128 位。MD4 已证明不够安全。

MD5(RFC 1321): Message Digest Algorithm 5(消息摘要算法第五版)
信息摘要算法可以用于确保信息传输完整一致.当然,也有用在加密上的,比如有的数据库在存储用户数据时,选择使用md5加密用户密码.是 Rivest 于1991年对 MD4 的改进版本。它对输入仍以 512 位分组,其输出是 128 位。MD5 比 MD4 复杂,并且计算速度要慢一点,更安全一些。MD5 已被证明不具备”强抗碰撞性”。

SHA (Secure Hash Algorithm)是一个 Hash 函数族,由 NIST(National Institute of Standards and Technology)于 1993 年发布第一个算法。目前知名的 SHA-1 在 1995 年面世,它的输出为长度 160 位的 hash 值,因此抗穷举性更好。SHA-1 设计时基于和 MD4 相同原理,并且模仿了该算法。SHA-1 已被证明不具”强抗碰撞性”。
为了提高安全性,NIST 还设计出了 SHA-224、SHA-256、SHA-384,和 SHA-512 算法(统称为 SHA-2),跟 SHA-1 算法原理类似。SHA-3 相关算法也已被提出。

sha系列中的sha1, sha224, sha256适用于长度不超过2^64二进制位的消息。sha384和sha512适用于长度不超过2^128二进制位的消息。

  • 1
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Erice_s

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值