Python3教程:加密模块-hashlib

yizhihongxing

一、哈希

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教程:类的派生

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

    Python开发 2023年3月31日
    00
  • Python教程: ‘==‘ 与‘is‘ 以及它们背后的小秘密

    比较判断逻辑是在代码中经常使用的,在Python中常用 ‘==’ 和 is 来做比较判断。 == : 双等号是用来比较变量所指向内存单元中的值是否相等,它只关心值,并不在意值的内存地址,也就是说可以是两个不同内存地址的值相等。 is : 它用来比较两个变量是不是指向同一个内存单元,虽然它也可以比较值,但是它更加关心的是内存地址是否一样,当然内存地址一样值也就…

    Python开发 2023年4月2日
    00
  • Python教程:list.sort()和函数sorted(list)

    1.sort()是列表的方法,修改原列表使得它按照大小排序,没有返回值,返回None In [90]: x = [4, 6, 2, 1, 7, 9] In [91]: x.sort() In [92]: x Out[92]: [1, 2, 4, 6, 7, 9] In [98]: aa = x.sort() In [99]: aa # 返回None 2.so…

    Python开发 2023年4月2日
    00
  • python中可以处理word文档的模块:docx模块

    一.docx模块 Python可以利用python-docx模块处理word文档,处理方式是面向对象的。也就是说python-docx模块会把word文档,文档中的段落、文本、字体等都看做对象,对对象进行处理就是对word文档的内容处理。 二.相关概念 如果需要读取word文档中的文字(一般来说,程序也只需要认识word文档中的文字信息),需要先了解pyth…

    Python开发 2023年3月31日
    00
  • Python中5大模块的使用教程(collections模块、time时间模块、random模块、os模块、sys模块)

    1. 模块的简单认识 定义: 模块就是我们把装有特定功能的代码进行归类的结果. 从代码编写的单位来看我们的程序,从小到大的顺序: 一条代码 < 语句块 < 代码块(函数,类) < 模块.我们⽬目前写的所有的py文件都是模块.引入模块的方式: import 模块 from xxx import 模块 2. collections模块 coll…

    Python开发 2023年4月2日
    00
  • Python3教程:多线程的使用教程

    一、简介 Python中使用线程有两种方式:函数或者用类来包装线程对象。 函数式:调用 _thread 模块中的start_new_thread()函数来产生新线程。语法如下: 参数说明: function – 线程函数。 args – 传递给线程函数的参数,他必须是个tuple类型。 kwargs – 可选参数。 实例: import _thread im…

    Python开发 2023年4月2日
    00
  • Python学习:转义字符及用法、数据类型转换函数

    ASCII编码为每个字符都分配了唯一的编号,成为编码值。在Python中,一个ASCII字符除了可以用它的实体(真正的字符)表示,还可以用它的编码值表示。这种使用编码值来间接地表示字符的方式成为转义字符(Escape Character)。 转义字符以\0或者\x开头、以\0开头表示后跟八进制形式的编码值,以\x开头表示后跟十六进制形式的编码值。Python…

    Python开发 2023年4月2日
    00
  • Python中文分词库——jieba的用法

    1.介绍 jieba是优秀的中文分词第三方库。由于中文文本之间每个汉字都是连续书写的,我们需要通过特定的手段来获得其中的每个单词,这种手段就叫分词。而jieba是Python计算生态中非常优秀的中文分词第三方库,需要通过安装来使用它。 jieba库提供了三种分词模式,但实际上要达到分词效果只要掌握一个函数就足够了,非常的简单有效。 安装第三方库需要使用pip…

    python 2023年4月25日
    00
合作推广
合作推广
分享本页
返回顶部