hashlib模块

1、HASH

  Hash通常翻译为"散列",或音译为"哈希"。将任意长度的输入(也叫预映射,pre-image)经过散列算法,变换为固定长度的输出,这个输出就是散列值。这种转换是一种压缩映射,散列值的空间一般远小于输入的空间。不一样输入可能会散列为相同输出,所以不可能从散列值来惟一肯定输入值。python

  Hash定义:一种将任意长度的消息压缩到某一固定长度的消息摘要的函数。
  Hash功能:主要用于信息安全领域中加密算法,他把一些不一样长度的信息转化成杂乱的128位的编码里,叫作HASH值.
git

  hash就是找到一种数据内容和数据存放地址之间的映射关系算法

2、MD5

一、MD5概念

MD5讯息摘要演算法(英语:MD5 Message-Digest Algorithm)。是一种被普遍使用的密码杂凑函数,能够产生出一个128位的散列值(hash value),用于确保信息传输完整一致。MD5的前身有MD二、MD3和MD4。
缓存

二、MD5功能

  (1)输入任意长度的信息,通过处理,输出为128位的信息(数字指纹);安全

  (2)不一样的输入获得的不一样的结果(惟一性)函数

三、MD5算法的特色

  压缩性:任意长度的数据,算出的MD5值的长度都是固定的
  容易计算:从原数据计算出MD5值很容易
  抗修改性:对原数据进行任何改动,修改一个字节生成的MD5值区别也会很大
  强抗碰撞:已知原数据和MD5,想找到一个具备相同MD5值的数据(即伪造数据)是很是困难的。编码

MD5算法是否可逆?

  MD5不可逆的缘由是其是一种散列函数,使用的是hash算法,在计算过程当中原文的部分信息是丢失了的。加密

四、MD5用途:

  (1)防止被篡改spa

  (2)防止直接看到明文翻译

  好比在UNIX系统中用户的密码就是以MD5(或其它相似的算法)经加密后存储在文件系统中。当用户登陆的时候,系统把用户输入的密码计算成MD5值,而后再去和保存在文件系统中的MD5值进行比较,进而肯定输入的密码是否正确。经过这样的步骤,系统在并不知道用户密码的明码的状况下就能够肯定用户登陆系统的合法性。这不但能够避免用户的密码被具备系统管理员权限的用户知道,并且还在必定程度上增长了密码被破解的难度。)

  (3)防止抵赖(数字签名)

  这须要一个第三方认证机构。例如A写了一个文件,认证机构对此文件用MD5算法产生摘要信息并作好记录。若之后A说这文件不是他写的,权威机构只需对此文件从新产生摘要信息,而后跟记录在册的摘要信息进行比对,相同的话,就证实是A写的了。这就是所谓的“数字签名”。

3、SHA-1(安全哈希算法)

  安全哈希算法(Secure Hash Algorithm)主要适用于数字签名标准(Digital Signature Standard DSS)里面定义的数字签名算法(Digital Signature Algorithm DSA)。对于长度小于2^64位的消息,SHA1会产生一个160位的消息摘要。当接收到消息的时候,这个消息摘要能够用来验证数据的完整性。

  SHA是美国国家安全局设计的,由美国国家标准和技术研究院发布的一系列密码散列函数。位数越长,破解难度越大,但同时生成加密的消息摘要所耗时间也更长。目前最流行的是加密算法是SHA-256 .

4、MD5与SHA-1对比

  MD5与SHA-1均是从MD4发展而来,它们的结构和强度等特性有不少类似之处。

  SHA-1与MD5的最大区别在于其摘要比MD5摘要长32 比特。对于强行攻击,产生任何一个报文使之摘要等于给定报文摘要的难度:MD5是2128数量级的操做,SHA-1是2160数量级的操做。产生具备相同摘要的两个报文的难度:MD5是264是数量级的操做,SHA-1 是280数量级的操做。于是,SHA-1对强行攻击的强度更大。但因为SHA-1的循环步骤比MD5多80:64且要处理的缓存大160比特:128比特,SHA-1的运行速度比MD5慢

5、hashlib模块使用

一、python的md5加密与加盐

#md5加密是不可反解的
import hashlib
#实例化对象
obj=hashlib.md5()      #先建立一个md5的对象
#写入要加密的字节
obj.update("admin".encode("utf-8"))   #对谁加密就把谁道前面,python3中必须是字节,因此必须用.encode()
#获取密文
secret=obj.hexdigest()
print(secret)
##############################################################
 
import hashlib
obj=hashlib.md5(b'12334')                #实例化md5的时候能够给传个参数,这叫加盐
obj.update("admin".encode("utf-8"))      #是再加密的时候传入本身的一块字节,
secret=obj.hexdigest()
print(secret)
##############################################################
 
#由于用户密码已经被加密过了,并且是加盐的,因此再用户验证的时候用字符串或者直接的加密的的字节都不能正确判断,只能用加盐的字节所判断
 
import hashlib
SALT = b'2erer3asdfwerxdf34sdfsdfs90'
def md5(pwd):
    # 实例化对象
    obj = hashlib.md5(SALT)
    # 写入要加密的字节
    obj.update(pwd.encode('utf-8'))
    # 获取密文
    return obj.hexdigest()
 
user = input("请输入用户名:")
pwd = input("请输入密码:")
if user == 'oldboy' and md5(pwd) == 'c5395258d82599e5f1bec3be1e4dea4a':
    print('登陆成功')
else:
    print('登陆失败')

 

  python3中主要提供 SHA1, SHA224, SHA256, SHA384, SHA512 ,MD5 算法

import hashlib

m = hashlib.md5()
m.update(b"Hello")
m.update(b"It's me")
print(m.digest())
m.update(b"It's been a long time since last time we ...")

print(m.digest()) #2进制格式hash
print(len(m.hexdigest())) #16进制格式hash
'''
def digest(self, *args, **kwargs): # real signature unknown
    """ Return the digest value as a string of binary data. """
    pass

def hexdigest(self, *args, **kwargs): # real signature unknown
    """ Return the digest value as a string of hexadecimal digits. """
    pass

'''
import hashlib

# ######## md5 ########

hash = hashlib.md5()
hash.update('admin')
print(hash.hexdigest())

# ######## sha1 ########

hash = hashlib.sha1()
hash.update('admin')
print(hash.hexdigest())

# ######## sha256 ########

hash = hashlib.sha256()
hash.update('admin')
print(hash.hexdigest())


# ######## sha384 ########

hash = hashlib.sha384()
hash.update('admin')
print(hash.hexdigest())

# ######## sha512 ########

hash = hashlib.sha512()
hash.update('admin')
print(hash.hexdigest())
相关文章
相关标签/搜索