git中保证文件完整性的SHA-1值(commit ID)

在Git中,每个commit ID的信息(如cc127537978af35e2f502da7e8d22e340ed810e5)就是一个SHA-1 Hash值,它是对那个commit是Git仓库中内容和头信息(Header)的一个校验和(checksum)。Linux kernel开创者和Git的开发者——Linus说,Git使用了SHA-1并非是为了安全性,而是为了数据的完整性;它可以保证,在很多年后,你重新checkout某个commit时,一定是它多年前的当时的状态,完全一摸一样,完全值得信任。
在Git中,根据commit的SHA-1值(40个十六进制数字)进行了简单的划分目录,以前2位数字作为目录名,其下面是剩余38位数字组成的一个文件名,以我的一个backup.git代码仓库为例,演示如下。


SHA-1是一种加密哈希函数(cryptographic hash function),另外两种SHA(secure hash algorithm)算法是SHA-0和SHA-2。SHA-1将文件中的内容通过其hash算法生成一个160bit的报文摘要,即40个十六进制数字(每个十六进制数字占4位)。它几乎可以保证,如果两个文件的SHA-1值是相同的,那么它们确是完全相同的内容(类似于生活中的指纹识别);不过也不是绝对的安全可靠,最新资料显示,理论上对其进行哈希碰撞(hash collision,不同的两块数据有相同的hash值)的攻击可以在2^51(2的51次方)左右的次数内实现。(BTW,国内也有对密码攻击研究深入的学者,我就看到wikipedia上经常提到山东大学的王小云[Wang Xiaoyun]教授,有兴趣研究密码破译攻击的,可以google其论文来读读。)由于SHA-1不是足够的安全,现在美国的很多政府部门都开始不采用SHA-1而采用SHA-2(256/224/512/384等多种长度的输出报文摘要,目前还没有发现其hash碰撞的存在)。SHA-1主要有两种用途,一个是加密,一个是数据完整性校验。
另外,哈希函数是一种将大的变长的数据集映射到一个固定长度的较小数据集的算法。A hash function is any algorithm or subroutine that maps large data sets of variable length, called keys, to smaller data sets of a fixed length. 哈希函数的返回值,被称为哈希值、哈希编码、哈希和、校验和或者就叫做哈希(hash values, hash codes, hash sums, checksums or simply hashes.)常见的Hash算法还有我们很熟悉的MD5(可以用md5sum工具计算),MD5是128bit的报文摘要(密文)。
在加密(如SHA-1算法)中,源数据一点儿的差异将会得到完全不同的加密后的密码(如SHA-1值),这种现象叫做“雪崩效应”(Avalanche effect)。
在Linux中的“coreutils”软件包中就包含了SHA相关的工具,进行一些简单的演示如下:

本来是简单了解一下Git中commit(SHA-1值),忽然思维发散,多理解了一些加密、哈希相关的东西,简记为此文吧。

欲了解更多,请参考如下网页:
http://git-scm.com/book/en/Git-Internals-Git-Objects
http://en.wikipedia.org/wiki/SHA-1
http://en.wikipedia.org/wiki/Xiaoyun_Wang

master

Stay hungry, stay foolish.

2 Comments

  1. 博主你太赞了!收藏了你的博客,望再接再厉,我一路支持。

发表评论

电子邮件地址不会被公开。 必填项已用*标注