专业文章

哈希(HASH)简介和取证应用丨反舞弊中的电子数据取证(十七)

2019-03-14
分享到

哈希是什么? 

“哈希”是一个音译词,源于英文的hash, 其本义“切碎并搅拌”,英语里有一种食物就叫 Hash,也就是把食材切碎搅拌做成的。 

计算机科学中的哈希一般指hash函数,也经常称作“散列”。哈希值在电子数据取证领域常用作校验数据的完整性,它的地位相当于法医的DNA检验、笔迹鉴定的书写动力定型、指纹鉴定的细节特征组合。 

哈希并不神秘,它的实质其实就是一个算法。 在数学中,算法可以很简单,比如b+1=a,把b看作是一个输入,a看作是一个输出,经过b+1的运算,得到a这个结果,我们输入2,经过2+1运算,得到3。 

就是这么简单! 

哈希算法从原理上来讲和b+1是一样的,只不过其运算相对复杂而已。它的输入可以是字符串、数据或者任何文件,任意长度的信息经过哈希运算后,输出一个固定长度的值,这个值就是哈希值。哈希运算是一种压缩映射,在哈希计算器中无论输入什么样的数据,最后得到的结果都是一个固定长度的数字/字母混合的随机数列。 

哈希运算有两个特点: 

1、只要原始信息更改哪怕一个字节,哈希计算的结果都会完全不同,要找到同一哈希值的两个不同源数据,在计算上来说是基本不可能的。 

2、在哈希函数中,不同的输入有可能会得到相同的哈希值,因此不可能通过哈希值来逆向确定唯一的输入值。通俗的讲就是,哈希算法不能从结果推算出输入。 

哈希的分类 

哈希算法有很多种,常见的如32位十六进制的MD5、64位十六进制数的SHA-256等,一般将这些哈希算法分为普通哈希和加密哈希两个大类。 

从本质上来讲,它们并没有什么不同,加密哈希跟普通哈希的区别只是安全性。例如:MD5算法设计初衷是做加密哈希的,但由于计算机的发展,MD5出现碰撞的概率变大,所以就只能被当普通哈希用来做数据校验。SHA-1曾经是加密哈希算法,从2017年开始,SHA-1算法生成的加密证书也被各大浏览器拒绝。目前流行的加密算法是SHA-2,跟SHA-1不同,SHA-2不是一种算法,而是一系列算法的统称,其中就包括上面说过的SHA-256。 

原则上,只要一种哈希算法出现过碰撞,就不会被推荐当作加密哈希,只有安全度高的哈希算法才能用作加密哈希。虽然哈希算法的安全性不单跟哈希数列长度有关,但大致上还是可以按照输出哈希的长度来区分,一般来说长度越长的算法被认为越安全,安全度低的被认为是普通哈希算法,主要用来做完整性校验;安全度高的被称为加密哈希算法,被用在加密算法中。 

不同的哈希算法的应用场景不同,由于越安全的哈希算法处理速度就越慢,所以并不是所有的场合都适合用加密哈希来替代普通哈希。 

几种常见的哈希算法: 

1、MD5 

MD5消息摘要算法(MD5 Message-Digest Algorithm)是一种被广泛使用的密码散列函数,可以产生一个128位(16字节)的哈希值,用于确保信息传输完整一致。它由美国密码学家罗纳德·李维斯特(Ronald Linn Rivest)设计,于1992年公开。 

2、SHA-1 

SHA全称叫作安全哈希算法(Secure Hash Algorithm),主要适用于数字签名标准(Digital Signature Standard DSS)里定义的数字签名算法(Digital Signature Algorithm DSA)。对于长度小于264位的消息,SHA-1会产生一个160位的消息摘要。当接收到消息的时候,这个消息摘要可以用来验证数据的完整性。在传输的过程中,数据很可能会发生变化,那么这时候就会产生不同的消息摘要。 SHA-1有如下特性:不可以从消息摘要中复原信息;两个不同的消息不会产生同样的消息摘要,(但会有1×1048分之一的机率出现相同的消息摘要,一般使用时忽略)。 

3、SHA-256 

SHA-256是SHA-2下细分出的一种算法,名称来自于安全散列算法2(Secure Hash Algorithm 2)的缩写,是一种密码散列函数算法标准,由美国国家安全局研发,属于SHA算法之一,是SHA-1的后继者。SHA-2下又可再分为六个不同的算法标准,包括了:SHA-224、SHA-256、SHA-384、SHA-512、SHA-512/224、SHA-512/256。这些变体除了生成摘要的长度、循环运行的次数等一些微小差异外,算法的基本结构是一致的。对于任意长度的消息,SHA-256都会产生一个256位长的哈希值,称作消息摘要,这个摘要相当于是个长度为32个字节的数组,通常用一个长度为64的十六进制字符串来表示。 

哈希的应用 

哈希有很多不同的称呼,有时候叫Digest(摘要),有时候叫Checksum(校验值),有时候叫Fingerprint(指纹),其实说的意思差不多,也就是说哈希是可以用来代表数据本身的。 因为数据在存储或者传输过程中如果有丝毫改动,它的哈希就会改变,由于这个独一无二的特性,哈希函数最常见作用就是进行数据完整性校验(Integrity Check),即数据无损校验。 

(一)文件校验 

常见的校验算法有奇偶校验和CRC校验,这两种校验在一定程度上能检测并纠正数据传输中的信道误码,却不能防止对数据的恶意破坏,没有抗数据篡改能力。 

MD5算法的“数字指纹”特性,使之成为目前应用最广泛的文件完整性校验算法,常被用在下面的2种情况下:

1、文件传输校验 

将传输后的文件与源文件的md5哈希值进行比对,确保一致性,就可以从统计上保证两个文件是完全相同的。一般用以检验文件在传输过程中是否出现错误,保证文件在传输过程中未被恶意篡改。很多下载工具软件中,也是利用MD5的特性,在用户多次断点续传后,仍能保证下载文件的正确性。 

还有一种更为先进的解决方法,就是所谓的代码签名。文件接受者不仅能验证文件的完整性,还可以依据自己对证书签发者和证书拥有者的信任程度,决定是否接受文件。浏览器在下载运行插件和java小程序时,使用的就是这样的模式。 

比方说我们从服务器下载一个软件,如果这个软件被黑客更改了,那么我们下载的就不是原来的软件,如果是银行客户端可能就会有账户被盗的风险。有了哈希运算后,可以把下载的软件经过哈希运算得到哈希值,然后把哈希值跟软件发行方公布的哈希值对比,就能知道软件是否有被篡改了。 

2、保存二进制文件系统数字指纹 

不少系统管理和安全软件都提供文件系统完整性评估的功能,在系统初始安装完毕后,建立对文件系统的基础校验和数据库,因为散列校验和的长度很小,它们可以方便的被存放在容量很小的存储介质上。以后还可以定期或根据需要,再次计算文件系统的校验值,一旦发现与原来保存的值有不匹配,就说明该文件已经被非法修改,或者是被病毒感染,或者被木马程序替代。 

(二)数字签名 

Hash算法是现代密码体系中一个重要组成部分,由于非对称算法的运算速度较慢,所以在数字签名协议中,单向散列函数扮演了重要的角色。在这种签名协议中,双方必须事先协商好双方都支持的Hash函数和签名算法。 

签名方先对该数据文件进行哈希值计算,然后再对很短的哈希值用非对称算法进行数字签名操作。对方在验证签名时,也是先对该数据文件进行计算其哈希值,然后再用非对称算法验证数字签名。对Hash值进行数字签名在统计上可以认为与对文件本身进行数字签名是等效的。首先,数据文件本身可以同它的哈希值分开保存,签名验证也可以脱离数据文件本身的存在而进行。其次,有些情况下签名密钥可能与解密密钥是同一个,也就是说,如果对一个数据文件签名,与对其进行非对称的解密操作是相同的操作,这是相当危险的,恶意的破坏者可能将一个试图骗你将其解密的文件,充当一个要求你签名的文件发送给你。因此,在对任何数据文件进行数字签名时,只有对其Hash值进行签名才是安全的。 

(三)鉴权协议 

有个称为“挑战-认证模式”的鉴权协议:需要鉴权的一方,向将被鉴权的一方发送随机串(“挑战”),被鉴权方将该随机串和自己的鉴权口令字一起进行 Hash 运算后,返还鉴权方,鉴权方将收到的Hash值与在己端用该随机串和对方的鉴权口令字进行 Hash 运算的结果相比较(“认证”),如相同,则可在统计上认为对方拥有该口令字,即通过鉴权。 

(四)网站注册 

在用户注册提交用户名密码时,用户名被直接保存到网站的数据库中,但密码却并不直接保存,而是把密码转换成哈希,再把哈希值保存到网站数据库中。因此,即使是网站管理人员,也拿不到用户的密码,万一公司数据库泄露,用户密码依然安全。 

当用户自己登录网站输入密码提交到服务器时,服务器也进行相同的哈希运算,由于输入数据没变,所以哈希也不变,登录成功。 

(五)区块链和加密货币 

在比特币系统中主要使用了两个密码学Hash函数,分别是SHA-256和RIPEMD160。 

以SHA-256为例,它是构造区块链所用的主要密码哈希函数。无论是区块的头部信息还是交易数据,都使用这个哈希函数去计算相关数据的哈希值,以保证数据的完整性。同时,在比特币系统中,基于寻找给定前缀的SHA256哈希值,设计了工作量证明的共识机制;SHA256也被用于构造比特币地址,即用来识别不同的用户。 

在比特币系统中,SHA-256算法的一个主要用途是完成PoW(工作量证明)计算。而区块链就可以看作一类使用哈希指针的链表,这个链表链接一系列的区块,每个区块包含数据以及指向表中前一个区块的指针。区块链中,前一个区块指针由哈希指针所替换,因此每个区块不仅仅告诉前一个区块的位置,也提供一个哈希值去验证这个区块所包含的数据是否发生改变。 

利用区块链构造一个防篡改的日志系统,在这个系统中,基于区块链的日志节点链表被用来存储数据,链表节点通过哈希指针链接,新节点追加在日志链表的尾部。同时,日志链表的头哈希指针所指向的头节点内容不可改变。若日志链表中的某个节点的数据被篡改,则系统能够检测出来。 

因此,若攻击者想在日志链表中的任意位置改变数据,为保持一致性,他必须向表头方向修改所有的哈希指针,最终由于不能改变链表头部而失败。因此,只需单个哈希指针,基本上就能保证整个链表的哈希值的一致性,从而达到防篡改的目的。

作者:星瀚内控与反舞弊法律中心 周晓鸣