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最后证明足以胜任,那么具有硬件加速支持是它的一大优势。
感兴趣的读者可以从这里阅读Linus的原文。
作者 曹知渊
转自 http://www.infoq.com/cn/news/2017/03/Linus-Announced-replace-SHA-1-Gi