ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

Python教程:hashlib加密

2021-02-24 16:02:16  阅读:203  来源: 互联网

标签:hashlib hash Vivian Python 教程 哈希 print 数据结构


一、哈希

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学习交流QQ群:778463939
寻找有志同道合的小伙伴,互帮互助,群里还有不错的视频学习教程和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

标签:hashlib,hash,Vivian,Python,教程,哈希,print,数据结构
来源: https://blog.csdn.net/qdPython/article/details/114025369

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有