Python3教程:加密模块-hashlib

一、哈希

1. 什么是可哈希(hashable)

简要的说,可哈希的数据类型,即不可变的数据结构(字符串str、元组tuple、对象集objects)。

2. 哈希有什么作用

它是一个将大体量数据转化为很小数据的过程,甚至可以仅仅是一个数字,以便我们可以用在固定的时间复杂度下查询它,所以,哈希对高效的算法和数据结构很重要。

3. 什么是不可哈希(unhashable)

同理,不可哈希的数据类型,即可变的数据结构 (字典dict,列表list,集合set)。

4. hash(object)

hash() 用于获取取一个对象(字符串或者数值等)的哈希值。返回对象的哈希值。

二、HASH(散列函数)

1. 简介

哈希(hash)也翻译作散列。Hash算法,是将一个不定长的输入,通过散列函数变换成一个定长的输出,即散列值。
这种散列变换是一种单向运算,具有不可逆性即不能根据散列值还原出输入信息,因此严格意义上讲Hash算法是一种消息摘要算法,不是一种加密算法。常见的hash算法有:SM3、MD5、SHA-1等 。

2. 应用

Hash主要应用在数据结构以及密码学领域。
在不同的应用场景下,hash函数的选择也会有所侧重。比如在管理数据结构时,主要要考虑运算的快速性,并且要保证hash均匀分布;而应用在密码学中就要优先考虑抗碰撞性,避免出现两段不同明文hash值相同的情况发生。
2.1 在密码学领域的应用

在密码学中,Hash算法的作用主要是用于消息摘要和签名,换句话说,它主要用于对整个消息的完整性进行校验。比如一些登陆网站并不会直接明文存储用户密码,存储的是经过hash处理的密码的摘要(hash值),当用户登录时只需要对比输入明文的摘要与数据库存储的摘要是否相同;即使黑客入侵或者维护人员访问数据库也无法获取用户的密码明文,大大提高了安全性。
2.2 在数据结构中的应用

使用Hash算法的数据结构叫做哈希表,也叫散列表,主要是为了提高查询的效率。它通过把关键码值映射到表中一个位置来访问记录,以加快查找的速度。这个映射函数就是hash函数,存放记录的数组叫做哈希表。在数据结构中应用时,有时需要较高的运算速度而弱化考虑抗碰撞性,可以使用自己构建的哈希函数。

3. hash()

①相同的数值,不同的类型,哈希值相同

>>> n = hash(1)
>>> n
1
>>> n = hash(1.0)
>>> n
1

②相同字符串在同一次运行时的哈希值是相同的,但是不同次运行的哈希值不同

Python 3.7.2 (tags/v3.7.2:9a3ffc0492, Dec 23 2018, 23:09:28) [MSC v.1916 64 bit (AMD64)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> m = hash('Vivian')
>>> m
-2338955002766744599  # 第一次哈希值
>>> exit()

C:\Users\Administrator>python
Python 3.7.2 (tags/v3.7.2:9a3ffc0492, Dec 23 2018, 23:09:28) [MSC v.1916 64 bit (AMD64)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>>
>>> m = hash('Vivian')
>>> m
2113605006884176523  # 第二次哈希值

这是由于Python的字符串hash算法有一个启动时随机生成secret prefix/suffix的机制,存在随机化现象:对同一个字符串输入,不同解释器进程得到的hash结果可能不同。因此当需要做可重现可跨进程保持一致性的hash,需要用到hashlib模块。

三、hashlib模块

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

注:coding:utf-8

'''
学习中遇到问题没人解答?小编创建了一个Python学习交流群:711312441
寻找有志同道合的小伙伴,互帮互助,群里还有不错的视频学习教程和PDF电子书!
'''
import hashlib
# md5
m = hashlib.md5()
m.update(b'Vivian')
print(m.digest())  # 返回二进制的哈希值 b'\xe5if5\x05\x02\x1a!wR\xd6\xfa(\xae\r\xcb'
print(m.hexdigest())  # 返回十六进制的哈希值 e569663505021a217752d6fa28ae0dcb

m.update('你好'.encode('utf-8'))
print(m.hexdigest())  # 6ea8d7a29ea0706bdaca285e1d2ddd17
# m两次加密后的值 等于 两次字串拼接后一次加密的值
n = hashlib.md5()
n.update('Vivian你好'.encode('utf-8'))
print(n.hexdigest())  # 6ea8d7a29ea0706bdaca285e1d2ddd17

# sha1
m = hashlib.sha1()
m.update(b'Vivian')
print(m.hexdigest())  # 587bf2d7314da0ae33623bed16d872620b2768be
# sha256
m = hashlib.sha256()
m.update(b'Vivian')
print(m.hexdigest())  # 2f7caf725fb93a456e84100bdf98b91405e62f6e7ca99bc4e0b4a1993bf9e5c0
# sha512
m = hashlib.sha512()
m.update(b'Vivian')
print(m.hexdigest())
# d75e73edd6ab1801e3dbfcd5c504dca16f3c252f750411da7fdddc9b60013ad97844b6f86de29d3f9a6d07d2c93a53d6c9de9b548b8697f3c2494857176011dc

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Python3教程:加密模块-hashlib - Python技术站

(0)
上一篇 2023年4月2日 下午5:23
下一篇 2023年4月2日 下午5:23

相关文章

  • Python推导式创建数列的方法

    一、列表推导式 列表推导式生成列表对象,语法如下: ”’ [表达式 for item in 可迭代对象] 或者 [表达式 for item in 可迭代对象 if 条件判断] ”’ 例子 l1 = [x for x in range(5)] print(l1) # [0, 1, 2, 3, 4] l2 = [x*2 for x in range(1,5)…

    Python开发 2023年4月2日
    00
  • Python学习:构造函数与析构函数

    1.构造函数: __init__(self), 这个方法就是构造函数,在实例化的时候自动调用。 所有如果这个函数内有打印的方法,当实例出来的时候会打印里面的信息。 __init__方法的第一个参数永远都是self,表示创建实例本身,在__init__方法内部,可以把各种属性绑定到self,因为self指向创建的实例本身。 有了__init__方法,在创建实例…

    Python开发 2023年4月2日
    00
  • python中shutil和shutil库的用法

    一、shutil目录和文件操作 Python shutil库提供了对文件和目录复制、移动、删除、压缩、解压等操作。 1. 复制文件或目录 shutil.copy(src, dst):复制文件或目录 shutil.copyfile(src, dst):复制文件,src和dst只能是文件 shutil.copytree(src, dst, dirs_exist_…

    python 2023年4月18日
    00
  • python中的mysql操作教程及实例

    一. 数据库在自动化测试中的应用 存测试数据 有的时候大批量的数据,我们需要存到数据库中,在测试的时候才能用到,测试的时候就从数据库中读取出来。这点是非常重要的! 存测试结果 二. python中的数据库之必备前提条件 1. 安装:pyMysql python2中使用mysqldb,python3中不再支持,换成pyMysql 2. 安装步骤 安装pyMys…

    Python开发 2023年4月2日
    00
  • Python教程:类的派生

    一、派生 派生:子类中新定义的属性的这个过程叫做派生,并且需要记住子类在使用派生的属性时始终以自己的为准 1 派生方法一(类调用) 指名道姓访问某一个类的函数:该方式与继承无关 class OldboyPeople: “””由于学生和老师都是人,因此人都有姓名、年龄、性别””” school = ‘oldboy’ def __init__(self, nam…

    Python开发 2023年3月31日
    00
  • Python教程:高级特性

    1.切片 L[0:3]表示,从索引0开始取,直到索引3为止,但不包括索引3。即索引0,1,2,正好是3个元素。 如果第一个索引是0,还可以省略: >>> L =[‘Michael’, ‘Sarah’, ‘Tracy’, ‘Bob’, ‘Jack’] >>> L[:3] [‘Michael’, ‘Sarah’, ‘Tracy…

    Python开发 2023年3月31日
    00
  • Python学习:基础练习题

    1.输出0到100的数字,如果数字是3的倍数输出Fizz,5的倍数输出Buzz。 同时是3和5的倍数输出FizzBuzz,其他情况则打印原数字 for i in range(100): if i==0: print(i) elif i%3==0 and i%5==0: print(“FizzBuzz”) elif i%3==0: print(“Fizz”) …

    Python开发 2023年4月2日
    00
  • Python教程:OS与sys模块用法教程

    一、Python os模块 包含普遍的操作系统功能,如果你希望你的程序能够与平台无关的话,这个模块是尤为重要的。 1、os.access() 查看文件是否有指定权限,有则返回True否则返回flase os.access(path, mode) path:指定文件路径 mode:参数有F_OK(是否存在),R_OK(可读),W_OK(可写),X_OK(可执行…

    Python开发 2023年3月31日
    00
合作推广
合作推广
分享本页
返回顶部