本文章讲如何通过Python实现计算文件或字符串的MD5, SHA1, SHA224, SHA256, SHA384, SHA512值。
原文:https://blog.zeruns.tech/archives/582.html
MD5讯息摘要演算法(英语:MD5 Message-Digest Algorithm),一种被广泛使用的密码杂凑函数,可以产生出一个128位的散列值(hash value),用于确保信息传输完整一致。MD5的前身有MD2、MD3和MD4。
输入任意长度的信息,经过处理,输出为128位的信息(数字指纹);
不同的输入得到的不同的结果(唯一性);
MD5不可逆的原因是其是一种散列函数,使用的是hash算法,在计算过程中原文的部分信息是丢失了的。
安全哈希算法(Secure Hash Algorithm)主要适用于数字签名标准(Digital Signature Standard DSS)里面定义的数字签名算法(Digital Signature Algorithm DSA)。对于长度小于2^64位的消息,SHA1会产生一个160位的消息摘要。当接收到消息的时候,这个消息摘要可以用来验证数据的完整性。
SHA是美国国家安全局设计的,由美国国家标准和技术研究院发布的一系列密码散列函数。
由于MD5和SHA-1于2005年被山东大学的教授王小云破解了,科学家们又推出了SHA224, SHA256, SHA384, SHA512,当然位数越长,破解难度越大,但同时生成加密的消息摘要所耗时间也更长。目前最流行的是加密算法是SHA-256 .
摘要算法模块使用教程:https://blog.zeruns.tech/archives/581.html#摘要算法模块%20hashlib
源码下载:https://gist.github.com/zeruns/015317b1ddac1957b8d5ee3afad4ba90
# Python计算字符串或文件的MD5/SHA值
import time
import os
import hashlib
# 计算文件的MD5/SHA值
def file(path, algorithm):
global start, end # 声明全局变量
start = time.time() # 获取当前时间,用于记录计算过程的耗时
size = os.path.getsize(path) # 获取文件大小,单位是字节(byte)
with open(path, 'rb') as f: # 以二进制模式读取文件
while size >= 1024 * 1024: # 当文件大于1MB时将文件分块读取
algorithm.update(f.read(1024 * 1024))
size -= 1024 * 1024
algorithm.update(f.read())
end = time.time() # 获取计算结束后的时间
print()
print(algorithm.hexdigest()) # 输出计算结果
# 计算字符串的MD5/SHA值
def str(text, algorithm):
global start, end
start = time.time()
algorithm.update(text.encode(encoding='UTF-8'))
end = time.time()
print()
print(algorithm.hexdigest())
print('https://blog.zeruns.tech')
print('1.MD5 2.SHA1 3.SHA224 4.SHA256 5.SHA384 6.SHA512')
flag1 = int(input('请选择算法:'))
print('\n1.文件 2.字符串')
flag2 = int(input('请选择要计算的是文件还是字符串:'))
if flag2 == 1:
path = input('\n请输入要计算的文件的目录(若跟脚本同目录直接输入文件名即可):')
if flag1 == 1:
file(path, hashlib.md5())
elif flag1 == 2:
file(path, hashlib.sha1())
elif flag1 == 3:
file(path, hashlib.sha224())
elif flag1 == 4:
file(path, hashlib.sha256())
elif flag1 == 5:
file(path, hashlib.sha384())
elif flag1 == 6:
file(path, hashlib.sha512())
elif flag2 == 2:
text = input('\n请输入要加密的字符串:')
if flag1 == 1:
str(text, hashlib.md5())
elif flag1 == 2:
str(text, hashlib.sha1())
elif flag1 == 3:
str(text, hashlib.sha224())
elif flag1 == 4:
str(text, hashlib.sha256())
elif flag1 == 5:
str(text, hashlib.sha384())
elif flag1 == 6:
str(text, hashlib.sha512())
print("\n计算耗时: %s seconds" % (end - start))