Python常用加密函数

摘要算法简介

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

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

摘要算法之所以能指出数据是否被篡改过,就是因为摘要函数是一个单向函数,计算f(data)很容易,但通过digest反推data却非常困难。而且,对原始数据做一个bit的修改,都会导致计算出的摘要完全不同。

MD5

MD5消息摘要算法(Message Digest Algorithm),一种被广泛使用的密码散列函数,可以产生一个128位(16字节)的散列值(hash value)。

使用方法

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

# 示例一
1>>> import hashlib
2>>> md5 = hashlib.md5()
3>>> md5.update('123'.encode())
4>>> print(md5.hexdigest())
202cb962ac59075b964b07152d234b70
5>>> md5.update('123'.encode())
6>>> print(md5.hexdigest())
4297f44b13955235245b2497399d7a93  # 发现两次对123加密的结果不一样

1>>> md5=hashlib.md5()        # 重新定义md5
2>>> md5.update('123123'.encode())
3>>> print(md5.hexdigest())
4297f44b13955235245b2497399d7a93  # 发现加密123123和上面的结果一样就验证了md5.update是拼接的效果
# 示例2
import hashlib

md5 = hashlib.md5()
md5.update('how to use md5 in python hashlib?')
print md5.hexdigest()  # d26a53750bc40b38b65a520292f69306

md5 = hashlib.md5()
md5.update('how to use md5 in ')
md5.update('python hashlib?')
print md5.hexdigest()  # d26a53750bc40b38b65a520292f69306

以上都是对于英文进行加密,如果对中文按以上方法加密,会出现错误,原因在于字符编码问题上。中文加密如下
data = ‘你好’
hashlib.md5(data.endode(encoding="utf-8")).hexdigest()

示例一:密码加密与验证

import hashlib


def pwd_encrypt(password):
    """加密"""
    md5 = hashlib.md5()
    md5.update(password.encode('utf-8'))
    result = md5.hexdigest()  # 返回16进制的数据字符串
    return result


def pwd_check(pw1, pw2):
    """校验数据"""
    if pwd_encrypt(pw1) == pwd_encrypt(pw2):
        return 1
    else:
        return 2


print(pwd_check('123456', '1234567'))
print(pwd_check('123456', '123456'))

示例2:验证文件

import hashlib

m = hashlib.md5()
src = 'I like Python'  # 假设文件内容
m.update(src.encode('utf-8'))
print(m.hexdigest())  # 17008b7417701b0c233b999d20c13f1d

# 假设现有有两个文件,我们需要验证这两个文件是否一样
def out_md5(src): # 简单封装 
	m = hashlib.md5() 
	m.update(src.encode('utf-8')) 
	return m.hexdigest()


def check():
    with open('1.txt', 'r') as f:
        src = f.read() 
        m1 = out_md5(src) 
        print(m1)

    with open('2.txt', 'r') as f:
        src = f.read() 
        m2 = out_md5(src)
        print(m2)

    if m1 == m2:
        print(True)
    else: 
        print(False)

加密是添加SALT

#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('登录失败')

SHA1

SHA1(Secure Hash Algorithm 1) 安全散列算法1,是一种密码散列函数。SHA-1可以生成一个被称为消息摘要的160位(20字节)散列值,散列值通常的呈现形式为40个十六进制数。

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

调用与MD5完全类似

import hashlib

sha1 = hashlib.sha1()
sha1.update('how to use sha1 in ')
sha1.update('python hashlib?')
print sha1.hexdigest()

你可能感兴趣的:(Python基础)