hashlib模块为加密算法
MD5算法运行1000次的平均时间为:226ms
SHA1算法运行1000次的平均时间为:308ms
SHA256算法运行1000次的平均时间为:473ms
常见的为后面两种,md5为比较旧的加密方法,可通过撞库实现破解
目前SSL证书必都是通过SHA256加密方法
三种加密方法都是加密不可逆
MD5加密
MD5算法的原理可简要的叙述为:MD5码以512位分组来处理输入的信息,且每一分组又被划分为16个32位子分组,经过了一系列的处理后,算法的输出由四个32位分组组成,将这四个32位分组级联后将生成一个128位散列值。
总体流程如下图所示,每次的运算都由前一轮的128位结果值和当前的512bit值进行运算
SHA1加密算法
SHA-1是一种数据加密算法,该算法的思想是接收一段明文,然后以一种不可逆的方式将它转换成一段(通常更小)密文,也可以简单的理解为取一串输入码(称为预映射或信息),并把它们转化为长度较短、位数固定的输出序列即散列值(也称为信息摘要或信息认证代码)的过程。
单向散列函数的安全性在于其产生散列值的操作过程具有较强的单向性。如果在输入序列中嵌入密码,那么任何人在不知道密码的情况下都不能产生正确的散列值,从而保证了其安全性。SHA将输入流按照每块512位(64个字节)进行分块,并产生20个字节的被称为信息认证代码或信息摘要的输出。
该算法输入报文的长度不限,产生的输出是一个160位的报文摘要。输入是按512 位的分组进行处理的。SHA-1是不可逆的、防冲突,并具有良好的雪崩效应。
通过散列算法可实现数字签名实现,数字签名的原理是将要传送的明文通过一种函数运算(Hash)转换成报文摘要(不同的明文对应不同的报文摘要),报文摘要加密后与明文一起传送给接受方,接受方将接受的明文产生新的报文摘要与发送方的发来报文摘要解密比较,比较结果一致表示明文未被改动,如果不一致表示明文已被篡改。
python中加密代码示例
# encoding: utf-8
import hashlib
import base64
md5 = hashlib.md5()
pwd = "123456"
md5.update(pwd.encode("utf-8")) # 在对传参进行加密的时候必须要加上encode指定编码
print(md5.digest()) # 二进制的保存方法
print(md5.hexdigest()) # 十六进制的保存方法,加密后的密文长度为32
print(len(md5.hexdigest()))
sha1 = hashlib.sha1(pwd.encode("utf-8")) # 也可在创建加密对象时传递参数,传参时必须要通过encode指定编码
print(sha1.hexdigest()) # 密文十六进制,加密后的密文长度为40
print(sha1.digest()) # 密文二进制显示
print(len(sha1.hexdigest()))
sha256 = hashlib.sha256(pwd.encode("utf-8")) # 同上,sha256加密示例
print(sha256.hexdigest()) # 十六进制的加密密文长度为64
print(sha256.digest())
print(len(sha256.hexdigest()))
# 使用base64进行加解密
jm = base64.b64encode("hello world".encode("utf-8")) # 对字符串hello world进行加密,通过encode指定编码
xm = base64.b64decode(jm).decode("utf-8") # 对加密后的密文进行一个解密,通过decode指定解密后的编码
print(jm)
print(xm)