python中md5加密和sha1加密详解

蔺沛
2023-12-01

1. MD5加密

(1)MD5的全称是Message-Digest Algorithm 5(信息-摘要算法)。128位长度。目前MD5是一种不可逆算法。

具有很高的安全性。它对应任何字符串都可以加密成一段唯一的固定长度的代码。

def md5(user):
    import hashlib
    import time

    ctime = str(time.time())
    m = hashlib.md5(bytes(str(user), encoding="utf-8"))
    m.update(bytes(ctime, encoding="utf-8"))
    return m.hexdigest()

(2)md5的用途 

  • 加密网站注册用户的密码。 (但去年的各大网站密码泄漏事件确实让人蛋疼……)
  • 网站用户上传图片 / 文件后,计算出MD5值作为文件名。(MD5可以保证唯一性)
  • key-value数据库中使用MD5值作为key。
  • 比较两个文件是否相同。(大家在下载一些资源的时候,就会发现网站提供了MD5值,就是用来检测文件是否被篡改)

2. SHA1加密

SHA1的全称是Secure Hash Algorithm(安全哈希算法) 。SHA1基于MD5,加密后的数据长度更长,它对长度小于264的输入,产生长度为160bit的散列值。比MD5多32位。

因此,比MD5更加安全,但SHA1的运算速度就比MD5要慢了。

ret = {
    "noncestr": nonce,
    "jsapi_ticket": js_ticket,
    "timestamp": timestamp,
    "url": url
}

temp = "&".join(['%s=%s' % (key.lower(), ret[key]) for key in sorted(ret)])
# 2. 将三个参数字符串拼接成一个字符串进行sha1加密
# sig是计算出来的签名结果
sig = hashlib.sha1(temp.encode("utf8")).hexdigest()

3. 处理大文件:

上面说过可以用MD5来检测两个文件是否相同,但想想,如果是两个很大的文件,担心内存不够用,这时怎么办?

这就要使用 update 方法了。代码如下:(windows 用户 要使用 'rb'方式打开文件)

import hashlib


def get_file_md5(f):
    m = hashlib.md5()

    while True:
        data = f.read(10240)
        if not data:
            break

        m.update(data)
    return m.hexdigest()


with open("wechat_share.py", 'rb') as f:
    a_md5 = get_file_md5(f)

with open("wechat_share_备份.py", 'rb') as f:
    b_md5 = get_file_md5(f)

print(a_md5)
print(b_md5)
print(a_md5 == b_md5)

如果两个文件内容一模一样最后返回True,否则返回False 

4. 测试一下

import hashlib

x = hashlib.md5()
x.update('hello, '.encode())
x.update('python'.encode())
print(x.hexdigest())

print(hashlib.md5('hello, python'.encode()).hexdigest())

两次的结果输出是一致的,SHA1 也是一样的用法。

 5. passlib库的使用

pip install passlib -i https://mirrors.aliyun.com/pypi/simple

passlib库包含了md5盐值加密解决了用户密码安全问题,案例:

    from passlib.hash import pbkdf2_sha256
    hash = pbkdf2_sha256.hash("123456")
    print(hash)
    ret = pbkdf2_sha256.verify("123456", hash)
    print(ret)
    ret2 = pbkdf2_sha256.verify("123457", hash)
    print(ret2)

输出:

$pbkdf2-sha256$29000$fQ.h9J4zprQWopSSkrK2lg$/TY/O.E08wtDQYVNFJxp8YdZ3iE6djTLM0XN3Gid2wI
True
False

passlib官方文档

 类似资料: