zoukankan      html  css  js  c++  java
  • python模块分析之hashlib加密(二)

    前言

    hashlib模块是py3.+用来对字符串进行hash加密的模块,核心算法是md5,明文与密文是一一对应不变的关系;用于注册、登录时用户名、密码等加密使用。

    模块分析

    hashlib模块有多种加密算法如:'md5', 'sha1', 'sha224', 'sha256', 'sha384', 'sha512','blake2b', 'blake2s','sha3_224', 'sha3_256', 'sha3_384', 'sha3_512','shake_128', 'shake_256'等;

    所有的算法是基于二进制加密的,所以对需要加密的字符串需要先进行编码。

    hashlib.algorithms_guaranteed:查看所有平台都支持的hash算法;
    hashlib.algorithms_available:查看所有的hash加密算法。
    

    主要函数

    hashlib.hexdigest():获取加密的密文,十六进制字符串,无参数。
    hashlib.digest():获取加密的密文,二进制,无参数。
    hashlib.copy():复制一份当前创建的hash对象,无参数。
    update(str1.encode("utf-8")):添加新的加密密文,得到的密文与原来的密文不相同。
    
    # 创建一个加密对象
    m = hashlib.new("md5",b"cai") # 选择md5加密函数加密字符串“cai”
    m.name:查看当前获得的hash对象的加密算法;
    m.digest_size:hash密文占多少个字节;
    m.block_size:hash数据块的大小。
    
    • 创建哈希对象
    import hashlib
    m = hashlib.new("md5", b"cai")  # 使用new的方式创建
    m = hashlib.md5("cai".encode()) # 直接指定加密算法
    m = hashlib.sha1("cai".encode())
    m = hashlib.sha224("cai".encode())
    m = hashlib.sha3_256("cai".encode())
    m = hashlib.sha3_384("cai".encode())
    
    • 多次加密

    当需要加密的字符串过大的时候,可以使用同一个hash对象分多次加密,update(a)+update(b)=update(a+b).

    import hashlib as hb
    m = hb.md5()
    m1 = m.copy()
    string = "adbcefg"
    for s in string:
        m.update(s.encode("utf-8"))
    # 输出密文1
    print(m.hexdigest()) # 26db8a4092166f88b63d8bafd34ce4b1
    # 输出与密文1完全相同的密文2
    m1.update(string.encode("utf-8"))
    print(m1.hexdigest()) # 26db8a4092166f88b63d8bafd34ce4b1
    

    hash算法的解密

    加密算法得到的密文不可逆,但是密文与明文之间的关系是一一对应的,这就使得解密出现了可能,目前对于简单的、迭代次数少或不加盐处理密文,常用方法是用大数据储存密文与明文的对应关系。如常用的解密网站:http://www.cmd5.com/

    通过输入密文查找对应的明文。为了增大破解的难度,一般需要对密码进行多次迭代加密和加盐处理,hashlib模块有一个专门的函数pbkdf2_hmac。

    • pbkdf2_hmac
    # 参数
    hash_name:签名算法名;
    password:需要加密的二进制编码
    salt:加盐
    iterations:迭代次数
    
    import hashlib as hb
    import binascii
    import base64
    pwd = "fdskhfkshfks"
    salt = "hhhhhhhh"
    # 获取加密后的二进制数
    dk = hb.pbkdf2_hmac('sha256', pwd.encode("utf-8"), salt.encode("utf-8"), 10000)  # 密码和杂质都需要是二进制类型
    print(dk) # b'x13Oxd5jjx92xfdxf9xefxaa>W[cx06xe0x96D=&x02Rxd683xee8x11xfbXxb6xf6'
    # 转换成十六进制对应的字符串
    print(binascii.hexlify(dk).decode("utf-8")) # 134fd56a6a92fdf9efaa3e575b6306e096443d260252d63833ee3811fb58b6f6
    # 转换成base64为编码的字符串
    print(base64.b64encode(dk).decode()) # E0/VamqS/fnvqj5XW2MG4JZEPSYCUtY4M+44EftYtvY=
    

    应用实例

    import hashlib as hb
    import base64
    def hash_fun(str1):
        m = hb.md5(str1.encode("utf-8"))  # 创建一个hash对象,并对str1加密
        # 输出得到的密文
        print(m.hexdigest())
        # base64编码的密文
        print(base64.b64encode(m.digest()).decode())
        print(m.block_size)  # 获取hash块的大小
        print(m.digest_size)  # 获取密文的字节数
        print(m.name)  # 获取加密算法的名字md5
    
    def hash_fun2(str1):
        m = hb.md5(str1.encode("utf-8"))
        print(m.hexdigest())
        a = m.copy()  # 拷贝一个hash对象
        print(a.hexdigest())  # 得到的密文没改变
    
    hash_fun("sb")
    

    总结

    • 我们一般通过new或pbkdf2_hmac函数加密字符串;

    • 加密的密文涉及到显示使用十六进制对应的字符串或base64编码的字符串

    参考

  • 相关阅读:
    NHibernate初学二之简单执行SQL及HQL、Linq
    NHibernate初学一之简单增删改查
    System.Func<>与System.Action<>
    C# Lambda表达式
    Lambda表达式详解
    发布订阅者模式之C#委托实现
    在WCF中实现双工通信
    设计模式---订阅发布模式(Subscribe/Publish)
    flex基础示例
    活动倒计时-兼容ios
  • 原文地址:https://www.cnblogs.com/cwp-bg/p/10256640.html
Copyright © 2011-2022 走看看