Linus宣布将替换git中的SHA-1算法

SHA-1是曾被广泛使用一种hash算法,由美国国家安全局设计(NSA),并由美国标准技术研究院(NIST)发布成为标准。hash算法的一种基本用途是确认数据的可信性,即一组数据对应一条唯一的hash值,且无法找出具有相同hash值的两组不同数据。基于这种属性,git在设计之初也选择了SHA-1作为其内部数据块的唯一标识符。

当可以找到两组数据具有相同hash值时,这种hash算法就被认为不再安全。2005年,山东大学的王小云教授及其同事提出了破解SHA-1的理论方法,安全分析家们随即发出了警告,呼吁认真对待这个成果。当时有人通过邮件就此事可能对git造成何种影响,向git的作者Linus Torvalds表达了忧虑。

Linus当时对此并不以为然,因为首先他认为git使用SHA-1更多是给数据对象一个标识符,而不是处于安全原因。从这一点上来说,甚至MD5也能胜任,只不过SHA-1的结果空间更大而已。同时,他认为git的分布式属性,会缓解攻击的可传播性。因为如果一个人的代码树中的内容被偷偷篡改,那么这个有问题的数据并不会“传染”给其他库,因为git认为具有相同SHA-1值的两个对象是一样的,本地库里面已经有的对象自然不需要从别人那里拉。Linus甚至还开玩笑说:

想篡改代码根本不必这么费事,还不如花一千万美元买通个程序员帮你植入后门。

John Gilmore,一名企业家及GNU的资深贡献者,为git未来的发展提出了建议。他认为目前没有一种hash算法能保证长久用下去,所以git需要检视其以前所做的安全假设,必须要考虑当两个不同对象具有同一hash值时,应该如何处理。同时git库和git本身应该尽量少耦合,库不应该依赖于使用何种hash算法,或者至少能简单地做一种hash算法切换到另一种。而增加对SHA-256的支持也应该提上日程。他呼吁Linus重视这个问题。他形象地说道:

火警已经响了,但你还没看到烟。现在逃的话,靠走就行,晚了就要狂奔了。

但12年过去了,git依然在使用SHA-1。近日,Google宣布攻破SHA-1,并发布了具有相同hash值的两份不同pdf文档,使整个事情再次成为焦点。Gilmore适时挖出了2005年的邮件并再次回复:

我曾经想修复这个,问题尚小时并不难,但Linus拒绝了,他好像并不明白威胁在哪。他对SHA-1的假设已经深深植根于整个git。未来几年中,那些难缠的人们将教会他如何攻击,同时破坏他和其他很多人的代码库。

Linus在他的Google+主页发文对SHA-1问题进行了完整的说明。他表达了三个观点:

在git中,SHA-1更多是“内容标识符”,而不涉及“信任”;针对目前发布的这种攻击很好规避,而且已经有两组补丁;有方案切换到其他算法,不会影响老的库。
前两点是他一直坚持的观点,但是他在文中给出了更多的细节说明。

git使用SHA-1主要是为了做错误检测,保证数据的完整性,对于信任问题,他说,他们的信任是基于人的,他不会因为某个特定的hash值就去信任某组数据。当然他也承认,在相当程度上,git也受益于SHA-1作为“信任工具”带来益处,所以攻破SHA-1对git确实有不良影响。

接下来,他对规避攻击的问题也做了详细解释。Linus认为攻击更可能发生在像pdf这样的“黑盒”数据中,因为pdf呈现的是打印效果,而不是文件的编码细节。而代码是一种“透明”的媒介,直接给人阅读的,如果有人往“好”代码中插入了一些垃圾,就会被注意到。而git内部的数据结构也是“透明”,尽管大部分人不这么认为。这就使得攻击git数据变得难以入手,一有动作就很容易被发现。当然还有一种可能是使用git管理pdf文件,Linus认为这是值得关注的场景,在git社区已经有人提交了针对这个问题的补丁,但尚未被合入。代码托管在github或kernel.org上的人则不需要担心这个问题,因为站方会定时运行这个检查,并在发现问题的时候通知用户。

总体来说,十二年过去了,Linus的观点未发生大的变化。但他也在不断听取社区的意见。他承诺会替换SHA-1,他说:

已经有计划了,看起来也不是很难,你甚至不需要转换你的库。但这涉及大量细节,需要时间来完成。

至于切换到哪种算法,目前尚未有定论,Linus在评论中答复一位读者说:

恐怕我们要切换到一种256位的算法了,具体哪种我要问问密码学专家,如果SHA-256最后证明足以胜任,那么具有硬件加速支持是它的一大优势。

本文转自d1net(转载)

时间: 2024-09-13 12:30:22

Linus宣布将替换git中的SHA-1算法的相关文章

PHP中使用递归替换数组中的内容

PHP开发小技巧实例程序,使用递归替换数组中的内容. <?php $arr = array("<小刚>","<小晓>","<小飞>","<小李>","<小红>"); function arrContentReplact($array) { if(is_array($array)) { foreach($array as $k => $v

Dreamweaver中使用正则表达式替换href中的内容

 可能在dw中使用正则表达式替换字符串的朋友很少,下面我来给大家介绍Dreamweaver中使用正则表达式替换href中的内容吧.    在Dreamweaver中使用正则表达式替换href中的内容,就像下面这些href中的内容复杂多样的情况下,href="/html/u.html",href="/tuho/huko.html",想将它们全部替换成href="#" ,具体做法如下: 查找: href="[^"]*"

Excel替换公式中的字符动画教程

<Excel2003入门动画教程64.Excel替换公式中的字符>. 演示动画 操作步骤 尽管Excel不是字处理软件,但是其替换功能仍然非常强大,不仅能替换单元格中的字符,而且可以替换公式中的字符. 例如,我们需要将公式中的字母"A"替换为"B",可以这样操作: 选中需要替换的单元格区域,执行"编辑替换"命令,打开"查找和替换"对话框,在"查找内容"右侧的方框中输入要替换的内容(如"

JS正则表达式替换页面中内容

问题描述 JS正则表达式替换页面中内容 我想用正则表达式替换table中除了标签""<tr class=""template"" ng-repeat=""model in model.child""></td>""里面的ng-model中的内容,将ng-model=""model.*""替换成ng-model="&

html-java如何替换HTML中标签内容

问题描述 java如何替换HTML中标签内容 java如何替换HTML中body中间的内容,我需要动态的在后台往里面插数据,所有需要动态生成,使用的是同一个html 解决方案 给该html设置id,使用var page = document.getElementById();方法获得该id里面的内容,然后设置page.innerHTML="你要填入的内容": 解决方案二: 关键看你要替换什么样的内容,如果是同一个html,那把要替换的部分改成特殊字符,做成模板方式.程序里替换那部分内容

jQuery替换textarea中换行的方法_jquery

本文实例讲述了jQuery替换textarea中换行的方法.分享给大家供大家参考.具体分析如下: 昨天同事在学习jQuery的时候,希望使用替换掉textarea中的换行. html部分: <fieldset> <textarea id="ncontent"></textarea> </fieldset> <button id="submit">提 交</button> js部分: $(docu

nsstring-objectiveC替换字符串中部分内容

问题描述 objectiveC替换字符串中部分内容 下面的代码是用来替换部分字符串,对一些普通字符,比如字母,就运行正常.但是如果是这样的符号 "?",就替换不了. 应该怎么办? [myString stringByReplacingOccurrencesOfString:@"?" withString:@"<BULLET_POINT>"]; 解决方案 完全的可以的啊: NSString *myString = @"Hell

jquery 修改和替换input中值的问题

问题描述 jquery 修改和替换input中值的问题 左边的input中用"_"短下划线分割了4组元素,我现在需要通过右边的下拉菜单选择数字(1-10),选择后替换input中第三个短下划线中的内容,请问如何实现 代码怎么写呢? 解决方案 思路:获取Input框的内容,以_分割 用获取到的下拉框的值进行替换 再回显到input框 解决方案二: $('#change').change(function(e){ var va = e.target.value; //取下拉框 value

c++-将一棵树(孩子兄弟链表)中所有与pattern匹配的子树替换为另外的子树 的算法

问题描述 将一棵树(孩子兄弟链表)中所有与pattern匹配的子树替换为另外的子树 的算法 将一棵树(孩子兄弟链表)中所有与pattern匹配的子树替换为另外的子树 的算法 解决方案 递归查找链表,如果当前节点与pattern匹配的话,就进行替换为另外的子树