前言

今天在看Malware Database这个github,发现每个文件都以SHA256来命名,想了想,确实应该如此,但是其实不应该如此,万一github的上传过程中,名称被改变了呢?或许应该另外通过一个更安全的方式,比如签名的方式来给出SHA256的值?

但是无论如何,想了想,应该写一篇关于SHA256的博文,加深一下自己的理解和印象。

正文

1. 使用各种系统检查文件完整性(SHA256)

对于不同系统而言(Windows、Linux、MacOS),我们都有不同的检查SHA256的应用。下面将分别介绍,不同系统的命令。

1.1 Windows

  1. WINDOWS + R
  2. 输入cmd,并且点击确认
  3. 输入命令certutil -hashfile [PATHFILE] SHA256
  4. 然后对比所产生的SHA256的值和作者所提供的SHA256的值

1.2 Linux

  1. 打开命令行terminal
  2. 输入命令sha256sum [PATHFILE]
  3. 然后对比所产生的SHA256的值和作者所提供的SHA256的值

1.3 MacOS

  1. 打开命令行terminal
  2. 输入命令shasum -a 256 [PATHFILE]
  3. 然后对比所产生的SHA256的值和作者所提供的SHA256的值

2. 为什么要检查文件完整性

2.1 我们应该检查所有文件的完整性

很合理的是,我们应该检查所有文件的完整性,最常发生的情况就是我们在网上下载一个文件的时候,尤其还是第三方网站下载文件的时候,万一文件被捆绑了病毒呢?并不是所有的文件都是open-source开源的,你无法看见里面的源码,万一文件有logic bomb逻辑炸弹呢?这都是很危险的行为,所以我们必须要检查文件的完整性。

2.2 一个例子

我们以两张图片举一个例子,这两张图片看起来没什么区别对吧,当然其实他们的大小是有区别的,但是一个黑客可以把大小控制的也没有区别,通过添加一些冗余的空白点,或者改变一些微小的像素点。

SHA256:
c55509b10c9527de0d6eb5931fa58989de8ab548755c56b9f3867af5d0c0eff3

SHA256:
649035c225b654b587b25e98e030810b2a04146f9a0ebe2045d1a4f19078c565

但其实他们是有区别的,一个是纯图片,一个包含了一个.zip的压缩文件。你可以自己下载图片,并且执行unzip命令,就会发现一个无法成功,但是一个可以解压出一个名叫Hides的文件,然后里面有一个叫做YouFindMe.LOL的文件。

幸好这只是一个图片,(但是图片也有可能封装一些恶意代码,然后和其他一些exe文件联动,他们看似毫无关联,实则可能危险之极),但是如果这是一个.EXE文件呢,如果你从某个地方下载了一个install.exe文件呢,你怎么能够区分得出,它是否含有病毒、蠕虫或者logic bomb?

因此检查文件的完整性是非常重要的。

# Download profile.jpg from internet: https://media.istockphoto.com/id/1300845620/vector/user-icon-flat-isolated-on-white-background-user-symbol-vector-illustration.jpg?s=612x612&w=0&k=20&c=yBeyba0hUkh14_jgv1OKqIH0CCSWU_4ckRkAoy2p73o=

# Make malicious zip
mkdir Hides
cd Hides
touch YouFineMe.LOL
zip -r Hides.zip Hides/
cat profile.jpg Hides.zip > profile.jpg

# When you want to unzip
unzip profile.jpg

总结

大家下载文件的时候,都最好下载作者有给SHA256 或者 MD5的文件,进行对比,虽然如今MD5已经不安全了,但是不安全只是意味着同一个MD5的Hash值可以对应两个完全不同的文件,但是要做到这样的一个MD5的Hash值还是在算力上相当困难的。但是即使MD5已经不安全了,那也比你随便从网上下载一个没有完整性检查的文件,要安全得多,你说对吧?(●ˇ∀ˇ●)

参考

[1] How to verify SHA-256 checksum?
[2] How to Hide Files Inside Images in Linux

Q.E.D.


立志做一个有趣的碳水化合物