1.hash是把任意长度的消息压缩到某一固定长度的数值的函数。
hash主要用于安全加密,把一些不同长度的信息转化成杂乱的128位编码里,叫做hash值。
hash就是把内容和内容地址之间找到一种映射关系,并不能够反推,从而达到加密。
2.MD5信息摘要算法,一种被广泛使用的密码杂凑函数。可以产生出一个128位的散列值,用于确保信息传输完整一致。
MD5功能:
输入任意长度的信息,通过MD5都会将其转化成一个128bit的信息(数字指纹)hash的是19个数字,152bit。MD5加密的是16个数字,128位。
不同的输入得到不同的结果。
>>> import hashlib
>>> dir(hashlib)
['__all__', '__builtin_constructor_cache', '__builtins__', '__cached__', '__doc__', '__file__', '__get_builtin_constructor', '__loader__', '__name__', '__package__', '__spec__', '_hashlib', 'algorithms_available', 'algorithms_guaranteed', 'blake2b', 'blake2s', 'md5', 'new', 'pbkdf2_hmac', 'sha1', 'sha224', 'sha256', 'sha384', 'sha3_224', 'sha3_256', 'sha3_384', 'sha3_512', 'sha512', 'shake_128', 'shake_256']
>>> m = hashlib.md5() # m是一个接收参数的对象。
>>> m.update(b'dapeng') # 接受的参数钱加b,表示以二进制方式读取。
>>> m.hexdigest() # 十六进制
'210ed3cf9a0ea07ae04e781fe424c087'
3.MD5算法特点
①﹐压缩性:任意长度信息算出MD5值的长度都是固定的,都是16位,128个字节。
②﹑容易计算。从原数据计算出MD5值很方便。
③ 抗修改性。对原数据进行1个字节的修改,MD5值都会发生很大的变化。
④ 强抗碰撞. 想找一个原数据的MD5值,几乎是不可能的,很难。
4.MD5算法的可逆性
MD5算法是不可逆的。因为在转化为MD5值的时候,原数据的部分信息是丢失的。
5.MD5的用途
文件在传输前会得到以恶搞MD5值,接收文件后得到的MD5值和传输前的比较,不一样则文件被修改过。
经常会看到一些文件提供下载会公布MD5值,就是因为如此,因为有的下载文件会被人传入病毒。
防止明文被看到
一些社交,需要支付的网站保存用户的密码,密码存放在数据库里,是以MD5值存放,工作人员看不到。
用户输入密码时会转化成MD5值,和数据库里的mD5值做比较,如果相等则验证成功。
既然MD5是不可逆的?网上存在的解密工具到底有什么意义?
输入一些简单的MD5值到网上的解密工具,真的能把你的信息显示出来,大吃一惊。
原来,网站的人员用一些程序24h在跑MD5值,并且创建了一个库,里面存放着MD5值和铭文相对应的关系。你输入MD5值,他会在库里找,并不是真的破解。
所以,密码得有多复杂就多复杂,很危险。简称撞库。
数字签名
需要第三方机构认证。比如一个人签订一份合同,第三方通过MD5算法生成一个MD5值。如果以后这个人反口否认合同是他写的,可以把合同新生成一个MD5值和以前的MD5值比较,相同则此人说谎,这就是数字签名。