【Day25】Git 版本控制 - SHA-1 是什麽

前面在讲要查询 commit 时要看他的 SHA-1 码,这个 SHA-1 到底是什麽!今天就来补充不知道也不会死的冷知识吧!!

SHA-1 的全名是 Secure Hash Algorithm 1,中文翻译就是「安全杂凑演算法 1」,他是一种密码杂凑演算法,透过演算产生 40 个十六进位的数字,下图为 SHA-1 压缩演算法中的一个回圈。

A, B, C, D和E是这个state中的32位元文字;F是会变化的非线性函式;<<<n代表bit向左循环移动n个位置。n因操作而异。田代表modulo 232之下的加法,Kt是一个常数。

SHA-1 的特性就是输入一样的值,就会产生一样的输出值,所以 git 都是使用这个演算法来产生编码的。

而 git 是使用「内容」来进行版本控制的,所以 SHA-1 看的并不是档案名称,而是他的内容。

那这个编码会不会有重复的问题?

上述有说过,SHA-1 是根据输入内容来决定,当输入的内容一样时就会产生一样的输出值,所以当 SHA-1 一样时,代表的是内容是一样的。

那如果,真的是两个内容不一样的档案却产生相同的 SHA-1 呢?这个情况称之为碰撞(collision),但这个情况发生的机率真的很小很小很小...

但又有另一个情况发生了!就是 Google 在 2017 年成功破解 SHA-1 码,就有很多人担心十分依赖 SHA-1 的 git 会不会因此被骇入,但 git 创始人 Linus Torvalds 回覆说「git 除了使用 hash 产生 SHA-1 外,还会纪录数据长度等资讯,因此破解上还是有一定难度」,而一样是使用 git 进行控管的 GitHub 则是表示「将增加 SHA-1 加密碰撞的自动侦测和预防的功能,避免所有代管专案发生档案杂凑值重复的情况。」以及「日後所有Github上任何SHA-1运算,都会进行检测,只要发现会产生碰撞,就会自动中止,来防止攻击者使用GitHub做为碰撞攻击的平台。」

以上就是关於 SHA-1 的一些小故事,可以更加理解 git 存取内容的方式,关於更多 git 的内部原理可以参考这篇文章

Reference

SHA-1 wiki
Git 内部原理


<<:  Day 25:我可以写什麽内容到部落格?

>>:  Day 27 云端邮差来罗-SNS

Day 30 关於这次的铁人赛,那些没能提到的事情

终於到最後一天了,可喜可贺可喜可贺!其实我也知道在这30天的期间内还有很多没能讲到的东西,既然都到最...

部署 Kolla-Ansible 使用 External Ceph

在部署 Kolla-Ansible 时,虽然能够同时部署 Ceph Cluster,但是在一些情况下...

[Day 27] 微探讨 Pure pipe 与 Impure pipe

今天要介绍的 Tip 是有关於 pipe 的 pure 与 impure,当没有任何额外的设定下,自...

D07 - 听话,给我资料!

既然已经透过 Serial API 取得 Port 存取权限了,再来我们就要来接收并解析资料了。 建...