12.9. hashlib算法库模块

hash:一种算法 ,3.x里代替了md5模块和sha模块,主要提供 SHA1, SHA224, SHA256, SHA384, SHA512 ,MD5 算法 三个特点: - 内容相同则hash运算结果相同,内容稍微改变则hash值则变 - 不可逆推 - 相同算法:无论校验多长的数据,得到的哈希值长度固定。

12.9.1. md5加密

hash = hashlib.md5()
hash.update('admin'.encode('utf-8'))
print(hash.hexdigest())
21232f297a57a5a743894a0e4a801fc3

12.9.2. sha1加密

hash = hashlib.sha1()
hash.update('admin'.encode('utf-8'))
print(hash.hexdigest())
d033e22ae348aeb5660fc2140aec35850c4da997

12.9.3. sha256加密

hash = hashlib.sha256()
hash.update('admin'.encode('utf-8'))
print(hash.hexdigest())
8c6976e5b5410415bde908bd4dee15dfb167a9c873fc4bb8a81f6f2ab448a918

12.9.4. sha384加密

hash = hashlib.sha384()
hash.update('admin'.encode('utf-8'))
print(hash.hexdigest())
9ca694a90285c034432c9550421b7b9dbd5c0f4b6673f05f6dbce58052ba20e4248041956ee8c9a2ec9f10290cdc0782

12.9.5. sha512加密

hash = hashlib.sha512()
hash.update('admin'.encode('utf-8'))
print(hash.hexdigest())
c7ad44cbad762a5da0a452f9e854fdc1e0e7a52a38015f23f3eab1d80b931dd472634dfac71cd34ebc35d16ab7fb8a90c81f975113d6c7538dc69dd8de9077ec

-‘加盐’加密 以上加密算法虽然很厉害,但仍然存在缺陷,通过撞库可以反解。所以必要对加密算法中添加自定义key再来做加密。

12.9.6. hmac加密

hmac内部对我们创建的key和内容进行处理后在加
import hmac
h = hmac.new('python'.encode('utf-8'))
h.update('helloworld'.encode('utf-8'))
print(h.hexdigest())
b3b867248bb4cace835b59562c39fd55

12.9.7. 获取文件的MD5

import hashlib
def md5sum(filename):
        """
        用于获取文件的md5值
        :param filename: 文件名
        :return: MD5码
        """
        if not os.path.isfile(filename):  # 如果校验md5的文件不是文件,返回空
            return
        myhash = hashlib.md5()
        f = open(filename, 'rb')
        while True:
            b = f.read(8096)
            if not b:
                break
            myhash.update(b)
        f.close()
        return myhash.hexdigest()

代码示例

#!/usr/bin/env python
# -*- coding:utf8 -*-
# auther; 18793
# Date:2019/8/25 10:49
# filename: 校对md5信息.py
import hashlib
import os


def md5sum(old_file, new_filename):
    """
    用于获取文件的md5值
    """
    if not os.path.isfile(old_file) or not os.path.isfile(new_filename):  # 如果被校验old_file或者new_file的md5的文件不是文件,返回空
        return
    myhash = hashlib.md5()
    with open(old_file, 'rb') as f:
        while True:
            b = f.read(8096)
            if not b:
                break
            myhash.update(b)

    old_md5 = myhash.hexdigest()

    with open(new_filename, 'rb') as f:
        while True:
            b = f.read(8096)
            if not b:
                break
            myhash.update(b)

    new_md5 = myhash.hexdigest()

    return old_md5, new_md5


# print(md5sum('test.txt', 'test1.txt'))


def md5_update(file):
    """
    :param file:文件名称
    :return:更新返回True,没更新返回False
    """
    if not os.path.isfile(file):  # 如果不是文件就返回空
        return
        # 创建MD5对象
    md5obj = hashlib.md5()
    with open(file, 'rb') as f:
        while True:
            b = f.read(8096)
            if not b:
                break
            md5obj.update(b)
    md5code = md5obj.hexdigest()
    print(md5code)

    old_md5code = ''
    f_name = 'md5.txt'

    if os.path.exists(f_name):
        with open(f_name, 'r', encoding='utf-8') as f:
            old_md5code = f.read()

    if md5code == old_md5code:
        print("数据没有更新.....")
        return False
    else:
        # 把新的md5写入文件中
        with open(f_name, 'w', encoding='utf-8') as f:
            f.write(md5code)
        print("数据更新")
        return True


md5_update('test.txt')