Hash函数知识点整理&Md5部分内容 | 您所在的位置:网站首页 › 什么叫哈希碰撞 › Hash函数知识点整理&Md5部分内容 |
名词概念解释
Hash函数
也叫哈希函数,散列函数,杂凑函数,压缩函数。 杂凑函数是杂凑算法的基础。 简单来说就是将做任意长度的消息压缩到某一固定长度的消息摘要的函数。 Hash值也叫消息摘要,指散列算法通过一系列的变化和运算获得输出的大小固定的字符串。 特征 主要特征算法公开,不需要密钥。经过加密的数据无法被解密(单向加密)。将任意长度的消息压缩到某一固定长度的值。 容易计算给出消息M,容易计算出该消息的杂凑值h(M) 输入敏感如果输入的数据信息被轻微修改,输出的Hash值也会有很明显的变化。能够保证文件或值的安全 抗碰撞性不易发生不同消息杂凑值相同的情况,但不是绝对 PS:弱抗碰撞是指在给定字符串和散列值的前提下找到另一个有相同散列值的字符串,难度极高 强抗碰撞性实质找到散列值相同的两个字符串,散列值是什么没有限制,难度很低,sha1也只需要263次即可尝试出来 应用密码安全认证,数字签名,数据完整性认证,秒速云上传文件等 数字签名 概念上锁(私钥签名)的消息摘要。 具体流程对发送方甲而言整个发送过程如下: 创建对称密钥 ( 相应软件生成,并且是一次性的 ) ,用其加密合同,并用乙的公钥打包对称密钥。 创建数字签名,对合同进行散列算法并产生原始摘要,甲用自己的私钥加密该摘要。 最后,甲将加密后的合同(数字签名)、打包后的密钥、原始摘要,以及甲的数字证书一起发给乙。 而接收方乙接收加密文件后,需要完成以下动作: 接收后,用乙的私钥解密得到对称密钥,并用对称密钥解开加密的合同,得到合同明文。对合同明文使用和发送者同样的散列算法来创建摘要(称做摘要2) 。 通过甲的数字证书获得属于甲的公钥,并用其解开摘要(称做摘要1)。 比较摘要1和摘要2,若相同,则表示信息未被篡改 , 且来自于甲。流程图如下: 杂凑算法 设计方法分为三大类,即基于模数运算的,基于分组加密的,定制的 目前最流行的是定制 基于模数运算:计算速度很慢,不实用 定制:不基于任何假设和密码体制,而是通过直接构造复杂的非线性关系达到单向要求,设计单向杂凑函数 具体如下图: 输出长度概念理解MD5 SHA1 SHA256 这3种本质都是摘要函数,MD5 是 128 位,SHA1 是 160 位 ,SHA256 是 256 位。 比特(bit),即一个二进制位 ,例如100011就是6比特; 电脑技术中对CPU在单位时间内(同一时间)能一次处理的二进制数的位数叫字长,所以能处理字长为8位数据的CPU通常就叫8位的CPU。即八位代表能处理八比特数据 十六位字符串表示十六个字符 而1字节=8bit ASCII码编码下,一个英文字母(不分大小写)占一个字节的空间。 所以,MD5加密后为16位字符串,SHA1是20位字符串,SHA256是32位字符串 安全杂凑函数的一般结构首先把消息分组,分为固定长度的a bit,最后一个分组不足a bit需要填充为a bit,最后一个分组还包含输入长度,反复使用压缩函数M 如下图: 杂凑算法的实例——MD5 md5存在问题 php漏洞PHP在处理哈希字符串时会利用”!=”或”==”来对哈希值进行比较,它把每一个以”0E”开头的哈希值都解释为0,所以如果两个不同的密码经过哈希以后,其哈希值都是以”0E”开头的,那么PHP将会认为他们相同,都是0。 数组绕过md5不能加密数组,传入数组会报错,但会继续执行并且返回结果为null php代码如下: md5(a[]=1) === md5(b[]=1)值为null===null,返回true 需要注意的是0e绕过只能绕过弱类型比较(),而数组绕过不只可以绕过弱类型比较,还可以绕过强类型比较(=) 弱类型比较(==),只判断内容是否相等,如果是字符串类型,则转换成数值型后进行判断 强类型比较(===),判断内容的基础上,还会判断类型是否相同 MD5碰撞MD5碰撞也叫哈希碰撞,即两个不同的值的散列值相同 MD5-SQL注入ffifdyop 的MD5加密结果是 276f722736c95d99e921722cf9ed621c 经过MySQL编码后会变成'or'6xxx,使SQL恒成立,相当于万能密码,可以绕过md5()函数的加密 “构造前缀碰撞法”几位密码学家使用的是“构造前缀碰撞法”(chosen-prefix collisions)来进行此次攻击,他们得出的结论是:MD5算法不应再被用于任何软件完整性检查或代码签名的用途。 另:现在,如果仅仅是想要生成 MD5 相同而内容不同的文件的话,在任何主流配置的电脑上用几秒钟就可以完成了。 md5加密代码实现 #md5进行数据的加密 import hashlib #md5加密 def md5sum(str): m = hashlib.md5() #创建一个hashlib.md5()对象 m.update(name.encode("utf8")) #将参数转换为UTF8编码 print(m.hexdigest()) #用十六进制输出加密后的数据 print md5sum(raw_input('Please string:') #用来获取控制台的 输入 参考&学习链接MD5加密漏洞(MD5绕过方式-0e绕过/数组绕过/MD5碰撞/MD5SQL注入) SHA安全散列算法 深入理解加密、解密、数字签名(签名证书、加密证书)的组成和数字证书 《应用密码学(第四版)》 |
CopyRight 2018-2019 实验室设备网 版权所有 |