飞道的博客

python3 加密模块的实现(hashlib,hmac)

248人阅读  评论(0)

hashlib模块:
Version:Python 3.6.1
hashlib:不可逆加密
hmac:不可逆键值对方式加密

hashlib模块:
hashlib模块为不同的安全哈希/安全散列(Secure Hash Algorithm)和 信息摘要算法(Message Digest Algorithm)实现了一个公共的、通用的接口,也可以说是一个统一的入口。因为hashlib模块不仅仅是整合了md5和sha模块的功能,还提供了对更多中算法的函数实现,如:MD5,SHA1,SHA224,SHA256,SHA384和SHA512。
使用步骤:
1、获取一个哈希算法对应的哈希对象:
(1):通过hashlib.new(哈希算法名称,初始出入信息)来获取这个哈希对象,如:hashlib.new(“MD5”,“username”),hashlib.new(“SHA1”,“username”)等。
(2):通过hashlib.哈希算法名称()来获取这个哈希对象,如:hashlib.md5(),hashlib.sha1()等。
2、设置追加信息:
调用哈希对象的updata(输入的信息)方法,设置追加信息。多次调用后等价于把所有追加的参数全部拼接起来作为一个参数,传递给update(),是累加,不是覆盖。
3、获取输入信息对应的摘要:
调用已经的到哈希对象的digest()或者hexdigest(),可得到传递给update()方法的字符串参数的摘要信息。
(1)digest()与hexdigest()的区别:
a、digest():摘要信息是一个二进制格式的字符串,其中可能包含非ASCII字符,包括NUL字节,该字符串长度可以通过哈希对象的digest_size属性获取。
b、hexdigest():摘要信息是一个16进制格式的字符串,该字符串中只包含16进制的数字,且长度是digest()返回结果长度的2倍。
示例代码1:

def hash_test():
    m = hashlib.md5()
    m.update(b"username")
    m.update(b"password") #最终加密的字符串参数是:username + password
    print(m.digest_size)
    print(m.digest())
    print(m.hexdigest())
hash_test()

返回结果:

16
b'\xd5\x1c\x9a~\x93Stj` \xf9`-E))'
d51c9a7e9353746a6020f9602d452929

代码示例2:

def hash_func():
    # hashlib.new(name[, data])     创建hashlib(非首选), name=算法名, data:数据
    hash = hashlib.new('sha1', 'username'.encode())
    strs = hash.name                # hash名称, 可传给new()使用
    hash.update("password".encode())    # 字节缓冲区 hash.update(x) hash.update(y) == hash.update(x+y)
    hash = hash.copy()                # 拷贝hash对象副本
    print(strs, hash)

    # algorithms_guaranteed返回的是所有平台支持的hash算法的名称,结果是一个集合
    dics = hashlib.algorithms_guaranteed
    print(dics)

    # algorithms_available返回的是在Python解析器中可用的hash算法的名称, 传递给new()时, 可识别,结果也是一个集合
    dics1 = hashlib.algorithms_available
    print(dics1)

    """
    加盐加密方法介绍:
    hashlib.pbkdf2_hmac(hash_name, password, salt, iterations, dklen=None)
    hash_name:hash名称, password:数据, salt:盐, iterations:循环次数, dklen:密钥长度
    """
    hash_bytes = hashlib.pbkdf2_hmac('SHA1', b'password', b'80', 100, 64)
    print(hash_bytes)

    num = hash.digest_size  # hash结果的大小
    num1 = hash.block_size  # hash算法的内部块的大小
    print(num, num1)

hash_func()

返回结果:

sha1
<sha1 HASH object @ 0x000002741602E030>
{
   'sha256', 'blake2s', 'sha224', 'sha3_512', 'shake_128', 'md5', 'sha384', 'blake2b', 'sha3_256', 'sha512', 'sha3_224', 'shake_256', 'sha1', 'sha3_384'}
{
   'sha256', 'blake2b', 'sha3_256', 'whirlpool', 'SHA', 'md5', 'sha384', 'RIPEMD160', 'dsaEncryption', 'sha', 'sha1', 'md4', 'SHA1', 'MD4', 'sha224', 'DSA-SHA', 'SHA256', 'sha512', 'sha3_224', 'SHA384', 'SHA224', 'SHA512', 'ripemd160', 'MD5', 'dsaWithSHA', 'blake2s', 'sha3_512', 'shake_128', 'DSA', 'shake_256', 'ecdsa-with-SHA1', 'sha3_384'}
b']\x85C\xff\x1d\xe8\xce\x97\x128\x9bP\xe6\x98\xdf/\x1eQ\x19\xb4\x04v\xf5\xcd\x00\xb8\xff#\xee\xa7\x07\x81)\xb8\xc7Se\x85\xef\xfa\x9d\x0e\x9auA8\x19\t\x0e\xee\xb5`\x9b\x07:2M\xd4\xc0\x0c\xfaz^/'
20
64

hmac模块
hmac算法也是一种一种单项加密算法,并且它是基于上面各种哈希算法/散列算法的,只是它可以在运算过程中使用一个密钥来增增强安全性。hmac模块实现了HAMC算法,提供了相应的函数和方法,且与hashlib提供的api基本一致。
使用步骤:
hmac模块的使用步骤与hashlib模块基本一致,只是在获取hmac对象时,只能使用hmac.new()函数,因为hmac模块没有提供与具体哈希算法对应的函数来获取hmac对象。如:hashlib可以用hashlib.md5()来产生一个哈希对象,但是hmac不行。

代码示例1:

def hmac_demo():
    hash = hmac.new(b"pwd")
    hash.update(b"uname")
    h_str = hash.hexdigest()
    print(h_str.upper())
    boolean = hmac.compare_digest(h_str, hmac.new("pwd".encode(), "uname".encode()).hexdigest())
    print(boolean)
hmac_demo()

返回结果:

675440AD536E602C322C90F8E0051975
True

示例代码2:

def hmac_func():
    # 创建key和内容,再进行加密
    # hmac.new(key, msg=None, digestmod=None)
    # 创建新的hmac对象, key:键, msg:update(msg), digestmod:hash名称(同hashlib.new())(默认md5)
    hc = hmac.new("userid".encode())
    hc.update("username".encode())  # 字节缓冲区 hc.update(a) hc.update(b) == hc.update(a+b)
    hash_bytes = hc.digest()  # 字节hash
    print(hash_bytes)
    hash_str = hc.hexdigest().upper()  # 16进制hash字符串
    print(hash_str)
    hc = hc.copy()  # 拷贝hmac副本
    print(hc)
    num = hc.digest_size  # hash大小
    print(num)
    strs = hc.name  # hash名称
    print(strs)
    # hmac.compare_digest(a, b) // 比较两个hash密钥是否相同, 参数可为: str / bytes-like object, (注:建议使用此方法,不建议使用a==b)
    boolean = hmac.compare_digest(hmac.new("uid".encode(), "uname".encode()).digest(), hmac.new("uid".encode(), "uname".encode()).digest())
    print(boolean)
    
hmac_func()

返回结果:

b'\x82jU\xd4I\xa3A?\x1d\x05\x00\xd89\xf9z\xb1'
826A55D449A3413F1D0500D839F97AB1
<hmac.HMAC object at 0x0000014F15668080>
16
hmac-md5
True

不对之处还望批评指正,谢谢!!


转载:https://blog.csdn.net/m0_57133702/article/details/115609259
查看评论
* 以上用户言论只代表其个人观点,不代表本网站的观点或立场