引言
什么是 MD5, 什么是 SHA1, 如何校验这些 Hash. 还有拿单个 apk 文件的 MD5,SHA1 讯问是不是原版的问题, 在这里, 让我们先来了解一些基本知识, 了解 Hash.
Hash
一般翻译做 "散列", 也有直接音译为 "哈希" 的, 就是把任意长度的输入(又叫做预映射, pre-image), 通过散列算法, 变换成固定长度的输出, 该输出就是散列值. 这种转换是一种压缩映射, 也就是, 散列值的空间通常远小于输入的空间, 不同的输入可能会散列成相同的输出, 而不可能从散列值来唯一地确定输入值.
简单的说就是一种将任意长度的消息压缩到某一固定长度的消息摘要的函数.
Hash 主要用于信息安全领域中加密算法, 他把一些不同长度的信息转化成杂乱的 128 位的编码里, 叫做 Hash 值. 也可以说, Hash 就是找到一种数据内容和数据存放地址之间的映射关系.
了解了 Hash 基本定义, 就不能不提到一些著名的 Hash 算法, MD5 和 SHA1 可以说是目前应用最广泛的 Hash 算法, 而它们都是以 MD4 为基础设计的.
MD4
MD4(RFC1320)是 MIT 的 RonaldL.Rivest 在 1990 年设计的, MD 是 MessageDigest 的缩写. 它适用在 32 位字长的处理器上用高速软件实现 -- 它是基于 32 位操作数的位操作来实现的.
MD5
MD5(RFC1321)是 Rivest 于 1991 年对 MD4 的改进版本. 它对输入仍以 512 位分组, 其输出是 4 个 32 位字的级联, 与 MD4 相同. MD5 比 MD4 来得复杂, 并且速度较之要慢一点, 但更安全, 在抗分析和抗差分方面表现更好.
MD5 是一种不可逆的加密算法, 目前是最牢靠的加密算法之一, 尚没有能够逆运算的程序被开发出来, 它对应任何字符串都可以加密成一段唯一的固定长度的代码.
那么它有什么用呢? 很简单, 通过它可以判断原始值是否正确(是否被更改过). 一般用于密码的加密. 而我们所提供的 MD5 校验码就是针对安装程序的唯一对应的一段代码. 你可以使用任何 MD5 运算器对下载的文件进行运算, 运算出来的结果如果完全符合我们提供的 MD5 校验码, 那么说明你下载的这个程序没有被中途修改过.
这个特征码有如下特性, 首先它不可逆, 例如我有一段秘密的文字如:"MySecretWords", 经算法变换后得到 MD5 码(b9944e9367d2e40dd1f0c4040d4daaf7), 把这个码告诉其他人, 他们根据这个 MD5 码是没有系统的方法可以知道你原来的文字是什么的.
其次, 这个码具有高度的离散性, 也就是说, 原信息的一点点变化就会导致 MD5 的巨大变化, 例如,"ABC"MD5(902fbdd2b1df0c4f70b4a5d23525e932)和 "ABC"(多了一空格)MD5(12c774468f981a9487c30773d8093561)差别非常大, 而且之间没有任何关系, 也就是说产生的 MD5 码是不可预测的.
最后由于这个码有 128 位那么长, 所以任意信息之间具有相同 MD5 码的可能性非常之低, 通常被认为是不可能的. 所以一般认为 MD5 码可以唯一地代表原信息的特征, 通常用于密码的加密存储, 数字签名, 文件完整性验证等.
SHA1 及其他
SHA1 是由 NISTNSA 设计为同 DSA 一起使用的, 它对长度小于 264 的输入, 产生长度为 160bit 的散列值, 因此抗穷举 (brute-force) 性更好. SHA-1 设计时基于和 MD4 相同原理, 并且模仿了该算法. SHA-1 是由美国标准技术局 (NIST) 颁布的国家标准, 是一种应用最为广泛的 Hash 函数算法, 也是目前最先进的加密技术, 被政府部门和私营业主用来处理敏感的信息. 而 SHA-1 基于 MD5,MD5 又基于 MD4.
数学家王小云
MD5 密码算法, 运算量达到 2 的 80 次方. 即使采用现在最快的巨型计算机, 也要运算 100 万年以上才能破解. 但王小云和她的研究小组用普通的个人电脑, 几分钟内就可以找到有效结果.
SHA-1 密码算法, 由美国专门制定密码算法的标准机构 --- 美国国家标准技术研究院与美国国家安全局设计, 早在 1994 年就被推荐给美国政府和金融系统采用, 是美国政府目前应用最广泛的密码算法. 2005 年初, 王小云和她的研究小组宣布, 成功破解 SHA-1.
HMAC_SHA1
一直以为 HMAC SHA1 和 SHA1 没有任何区别, 直到现在才发现它俩不是完全一样的. HMAC 的百度百科解释:
"HMAC 是密钥相关的哈希运算消息认证码(Hash-basedMessageAuthenticationCode),HMAC 运算利用哈希算法, 以一个密钥和一个消息为输入, 生成一个消息摘要作为输出."
可以看出, HMAC 是需要一个密钥的. 所以, HMAC SHA1 也是需要一个密钥的, 而 SHA1 不需要.
CRC
CRC 的全称为 CyclicRedundancyCheck, 中文名称为循环冗余校验. 它是一类重要的线性分组码, 编码和解码方法简单, 检错和纠错能力强, 在通信领域广泛地用于实现差错控制. 实际上, 除数据通信外, CRC 在其它很多领域也是大有用武之地的. 例如我们读软盘上的文件, 以及解压一个 ZIP 文件时, 偶尔会碰到 "BadCRC" 错误, 由此它在数据存储方面的应用可略见一斑.
这些 Hash 算法到底有什么用呢?
Hash 算法在信息安全方面的应用主要体现在以下的 3 个方面:
1)文件校验
我们比较熟悉的校验算法有奇偶校验和 CRC 校验, 这 2 种校验并没有抗数据篡改的能力, 它们一定程度上能检测并纠正数据传输中的信道误码, 但却不能防止对数据的恶意破坏. MD5Hash 算法的 "数字指纹" 特性, 使它成为目前应用最广泛的一种文件完整性校验和 (Checksum) 算法, 不少 Unix 系统有提供计算 md5checksum 的命令.
2)数字签名
Hash 算法也是现代密码体系中的一个重要组成部分. 由于非对称算法的运算速度较慢, 所以在数字签名协议中, 单向散列函数扮演了一个重要的角色. 对 Hash 值, 又称 "数字摘要" 进行数字签名, 在统计上可以认为与对文件本身进行数字签名是等效的. 而且这样的协议还有其他的优点.
3)鉴权协议
如下的鉴权协议又被称作 " 挑战 -- 认证模式: 在传输信道是可被侦听, 但不可被篡改的情况下, 这是一种简单而安全的方法.
当然, hash 函数并不是完全可靠, 不同文件产生相同 MD5 和 SHA1 的几率还是有的, 只是不高.
寻求原版的证实, 对应 SHA-1 和 MD5 外, CRC 的认证也是一个很重要的因素, CRC 同样是校验文件的完整性, 还有 CDIMGE 的封装版本.
微软出品的镜像都能通过 CRC 验证, 当然也有人使用 CRC 自己进行制作可以得到通过 CRC 的镜像, 那么这时候你需要对应镜像的 SHA-1 等了, 所以, 验证一个镜像的原盘可以通过对应多个数值来完成.
来源: http://www.tuicool.com/articles/iAFBFzZ