zoukankan      html  css  js  c++  java
  • Python(00):加密与解密hashlib与hmac模块

    Python的hashlib提供了常见的摘要算法,如MD5,SHA1等等。

    摘要算法又称哈希算法、散列算法。它通过一个函数,把任意长度的数据转换为一个长度固定的数据串(通常用16进制的字符串表示)。

    MD5是最常见的摘要算法,速度很快,生成结果是固定的128 bit字节,通常用一个32位的16进制字符串表示。

    一、hashlib加密模块

    hash是一种算法(Python3.版本里使用hashlib模块代替了md5模块和sha模块,主要提供 SHA1、SHA224、SHA256、SHA384、SHA512、MD5 算法),该算法接受传入的内容,经过运算得到一串hash值。

    hash值的特点:

    1. 只要传入的内容一样,得到的hash值一样,可用于非明文密码传输时密码校验
    2. 不能由hash值返解成内容,即可以保证非明文密码的安全性
    3. 只要使用的hash算法不变,无论校验的内容有多大,得到的hash值长度是固定的,可以用于对文本的哈希处理

    MD5是最常见的摘要算法,速度很快,生成结果是固定的128 bit字节,通常用一个32位的16进制字符串表示

    import hashlib
    
    m = hashlib.md5() # 创建md5对象
    b = 'hello'.encode(encoding='utf-8') # 此处必须encode, 或者 b = bytes(str, encoding='utf-8'),作用相同都是encode为bytes,将str默认的unicode转成utf-8.
    m.update(b); #该方法只接受bytes类型
    
    
    print(m.hexdigest())  #将hash中的数据转换成数据,其中只包含十六进制的数字。 5d41402abc4b2a76b9719d911017c592
    
    
    # 另一种写法:b‘’前缀代表的就是bytes ,对英文加密,才可以使用b' '前缀,b' '在python中只能对ASCII字符进行转码。
    str_md5 = hashlib.md5(b'this is a md5 test.').hexdigest() 
    print('MD5加密后为 :' + str_md5)

    如果数据量很大,可以分块多次调用update(),最后计算的结果是一样的。

    SHA1的生成结果是160 bit字节,通常用一个40位的16进制字符串表示。

    比SHA1更安全的算法是SHA256和SHA512,不过越安全的算法不仅越慢,而且摘要长度更长。

    二、hmac 加盐加密模块

    Python自带的hmac模块实现了标准的Hmac算法:Keyed-Hashing for Message Authentication。它通过一个标准算法,在计算哈希的过程中,把key混入计算过程中。它内部对我们创建key和内容做过某种处理后再加密。

    和我们自定义的加salt算法不同,Hmac算法针对所有哈希算法都通用,无论是MD5还是SHA-1。采用Hmac替代我们自己的salt算法,可以使程序算法更标准化,也更安全。

    我们来看看如何使用hmac实现带key的哈希。

    我们首先需要准备待计算的原始消息message,随机key,哈希算法,这里采用MD5,使用hmac的代码如下:

    import hmac
    message = b'Hello, world!'
    key = b'secret'
    h = hmac.new(key, message, digestmod='MD5')
    # 如果消息很长,可以多次调用h.update(msg)
    h.hexdigest() # 'fa4ee7d173f2d97ee79022d1a7355bcf'

    注意:要注意传入的key和message都是bytes类型,str类型需要首先编码为bytes

    def hmac_md5(key, s):
        return hmac.new(key.encode('utf-8'), s.encode('utf-8'), 'MD5').hexdigest()

    如果要保证hmac模块最终结果一致,必须保证:

    1. hmac.new括号内指定的初始key一样
    2. 无论update多少次,校验的内容累加到一起是一样的内容
    import hashlib
    import hmac
    
    # 注意hmac模块只接受二进制数据的加密
    h1 = hmac.new(b'hash', msg=None, digestmod=hashlib.md5)
    h1.update(b'hello')
    h1.update(b'world')
    print(h1.hexdigest())  # 905f549c5722b5850d602862c34a763e
    
    h2 = hmac.new(b'hash', msg=None, digestmod=hashlib.md5)
    h2.update(b'helloworld')
    print(h2.hexdigest())  # 905f549c5722b5850d602862c34a763e
    
    h3 = hmac.new(b'hashhelloworld', msg=None, digestmod=hashlib.md5)
    print(h3.hexdigest())  # a7e524ade8ac5f7f33f3a39a8f63fd25
  • 相关阅读:
    asp.net url传参中使用javascript过滤中文乱码
    Javascript 操作select控件大全(新增、修改、删除、选中、清空、判断存在等)【转】
    element.firstChild
    NHibernate使用Criteria分页显示并返回记录总数 【转】
    动态生成select选项全接触Javascript技术【转】
    struts中ApplicationResources.properties支持中文
    博客园博客美化方法大全[附源码]
    fileinput模块
    python学习
    遗忘的果实
  • 原文地址:https://www.cnblogs.com/springsnow/p/12558339.html
Copyright © 2011-2022 走看看