首页 > 编程知识 正文

数字签名为什么能保证完整性,数字签名的实现过程

时间:2023-05-05 15:01:55 阅读:170565 作者:2540

[转自外星人某平淡的钻石博客]

希望最近有网友在博客上留言,介绍哈希值检查文件的知识。 所以,我正在写《文件完整性检查》的盲教程。 由于本文属于盲的性质,所以不太会涉及技术化的内容。

什么是“完整性检查”?

“检查完整性”顾名思义就是检查文件是否完整。 那么,在什么情况下文件会被不完全堵塞呢? 可能存在以下情况:

1 .感染病毒

例如,假设系统感染了病毒。 假设病毒感染了某个软件安装包或可执行文件。 文件的完整性受到损害。

2 .植入木马/后门

另一个文件不完整的情况是被别有用心的人植入木马和后门。 例如,一些国内软件下载站点在后门安装了Windows安装光盘镜像。

3 .传输故障

这主要发生在互联网下载时。 因为互联网传输可能会产生错误代码,而且在下载即将结束时可能会断开。 这些情况会导致你下载的文件不完整。

现在的互联网环境与当时的调制解调器拨号相比,有了明显的改善。 所以,这种情况应该不多见。

哈希算法(哈希算法)盲

什么是“哈希算法/哈希算法”?

这里所说的“散列”是计算机算法,洋文称为Hash,根据音译有时也称为散列。

哈希算法可以将【任意大小】的数据(原始数据)转换为【固定大小】的“小”数据(被称为“哈希值”或“文摘”)。

摘要长度

对于特定的哈希算法,所获得的哈希值的长度总是固定的。 哈希值的长度也称为“摘要长度”。

典型散列算法的摘要长度如下所示

哈希算法哈希值位数哈希值字节数

CRC32 32 4

MD5 128 16

SHA1 160 20

SHA256 256 32

SHA512 512 64

哈希算法的特色

1 .不可逆性

从刚才的说明来看,散列似乎有点类似于压缩。 其实,哈希算法是与压缩算法完全不同的一滴。 【散列算法是有损的】,而压缩算法是可逆的(压缩的数据可以被恢复)。

有人把哈希算法称为“加密算法”,这也是错误的。 因为加密算法是可逆的,而哈希算法是【不可逆的】。

2 .确定性

通过某种哈希算法,对两个原始数据分别计算哈希值。 如果计算出的哈希值不同,则可以100%确定这两个数据是不同的——。 这就是“确定性”。

然而相反,若这两个数据的哈希值相同,则这两个数据只能说【非常可能】。 “非常有可能”是指没有达到100%。 关于原因,请参阅下一节“散列函数的可靠性”。

关于哈希算法的【可靠性】

“哈希冲突”是什么?

如上所述,可能非常小,会触发两个不同的原始数据并计算相同的哈希值。 这称为“散列冲突”或“散列冲突”。

碰撞类型

散列碰撞的类型大致有两种:

1 .随机冲突

随机冲突就像中彩票一样,完全是低概率的偶然因素——因为你碰巧遇到了两个不同的数据(文件),有着相同的散列值。

理论上,任何哈希算法都有随机冲突的可能性,只是可能性大或小。

2 .人为冲突

人为冲突是指某人(通常是恶意攻击者)故意制造散列冲突,以欺骗“基于散列值的完整性检查”。

如何避免冲突

1 .随机碰撞情况

要避免随机冲突,只需选择摘要长度足够长的散列算法即可。

让我举出刚才列举的三个例子。

CRC32的摘要长度为“32位”。 也就是说,最多可以表示“2的32次方”的许多可能性。 也就是说,数量级为数十亿,相当于地球总人口。 表面上看起来很大,但其实还不够。 例如,现在互联网上的页面总数大大超过了“几十亿”。 每页计算CRC32散列会遇到很多重复(冲突)。

另一方面,MD5的摘要长度为“128bit”,也就是【2的128次方】。 这个数字足够大。 通俗地说,从宇宙诞生到宇宙毁灭,你都未必有机会遇到MD5的【随机碰撞】。 另一方面,SHA1的摘要长度为“160bit”,这是不言而喻的。

2 .针对人为冲突

要避免人为冲突,必须同时考虑两个因素——散列算法的摘要长度,以及散列算法的优越性。 “摘要长度”刚才已经说明了。 让我只说“算法的优秀”。

如果散列算法是有缺陷的(不优秀的),则攻击者可以相对容易地构建两个【不同的】原始数据,但具有【相同的】散列值。 这样可以欺骗基于哈希算法的完整性检查。

典型的例子是MD5——该算法在过去的10年中非常流行,但几年前发现了严重的缺陷。 因此,MD5“随机冲突”的概率非常低,但“人为冲突”的概率【不低】。 重视安全性时,【不使用MD5进行完整性检查】。

进一步补充如下:

随着硬件计算能力的提高,SHA1也开始变得【否】安全(参照以下博文的密码学相关章节)。 今后SHA1为SHA256或SH

A512 替代。
《近期安全动态和点评(2019年2季度)》

★散列值校验的方法——使用网站提供的软件散列值

如今,大伙儿的安全意识越来越高了。相应的,很多知名的软件,除了在官网上提供下载,还会相应提供下载软件的散列值。yedby下载好某个软件之后,先在自己电脑里计算一下散列值,然后跟官方网站提供的散列值对比一下。如果散列值一样,通常就说明没问题。

举例:Firefox 浏览器的散列校验
  打开如下链接,就可以看到 Firefox 某个版本的 SHA1 列表(把网址中的 版本号 三个字替换为具体的【三段式】版本号,比如18.0.2)。这个列表很长,包括各种语言,各个平台。为了方便起见,你可以先算好 SHA1 散列值,然后到里面搜索该散列值
https://ftp.mozilla.org/pub/mozilla.org/firefox/releases/版本号/SHA1SUMS

某些菜鸟读者可能会问:如何在自己电脑上计算某个软件的散列值?
  这就需要看下一个章节。

★散列值校验的方法——使用客户端工具计算散列值

前面说完了校验的流程,最后再说一下校验的工具。
  考虑到大部分读者是 Windows 用户,俺介绍一下微软官方的 FCIV(洋文全称是“File Checksum Integrity Verifier”)。这是一个小巧、绿色、免费的命令行工具,下载页面在“这里”。
  因为是命令行工具,你需要先运行 CMD,出现 Windows 的命令行界面(黑窗口)之后,在其中使用该工具。下面是 FCIV 功能简介。

◇计算单个文件

比如你有一个微软的系统安装光盘镜像,位于 C:downloadWindows.iso 那么,用如下命令可以计算该文件的 SHA1 散列值
fciv -sha1 C:downloadWindows.iso

◇批量计算某个目录

FCIV 支持批量计算某个目录下的文件散列值。比方说,可以用如下命令可以计算 C:download 目录下的每一个文件的 SHA1
fciv -sha1 C:download

◇批量计算并存储,供前后对比

比如 C:download 目录下有很多文件。俺想知道过一段时间之后,这些文件是否被改过。那么,可以先用如下命令,把该目录中所有文件的 SHA1 散列都存储到某个 XML 格式的文件中(本例中,俺假设保存的文件是当前目录的 hash.xml,你也可以保存到其它文件名)
fciv -sha1 C:download -xml hash.xml

过了一段时间后,你可以用如下命令,就可以看出哪些文件被修改过。
fciv -sha1 C:download -xml hash.xml -v

★啥是“数字签名”?

所谓的“数字签名”,通俗来说,就是采用某种技术手段来证明某个信息确实是由某个机构(或某个人)发布的。因为其用途有点类似于传统的手写签字,所以称之为“数字签名”。
  数字签名的技术实现需要依赖于“非对称加密技术”和“数字证书体系”。关于“非对称加密技术”,考虑到篇幅,今天就不展开了;关于“数字证书”,3年前写过一篇扫盲(在“这里”),有兴趣的同学可以瞧一瞧,这里就不再啰嗦了。

★Windows 平台的“数字签名”

数字签名有很多种,大伙儿比较常见的是 Windows 平台下的数字签名。如今大型 IT 公司(比如“微软、Google、苹果”等)或者是知名开源组织发布的 Windows 软件,安装文件通常都内置数字签名。所以俺着重介绍 Windows 平台的数字签名该如何校验。

◇利用资源管理器验证单个文件

大概从 Windows 2000开始,Windows 就支持在某个文件尾部附加数字签名,并且 Windows 的资源管理器内置了对数字签名的校验功能。
  下面俺通过几个截图,简单介绍一下:如何在资源管理器中验证数字签名。

比如,俺手头有一个 Firefox 的安装文件(带有数字签名)。当俺查看该文件的属性,会看到如下的界面。眼神好的同学,会注意到到上面有个“数字签名”的标签页。如果没有出现这个标签页,就说明该文件没有附带数字签名。

选择该标签页,出现如下界面。
  顺便说一下,某些数字签名中没有包含“邮件地址”,那么这一项会显示“不可用”;同样的,某些数字签名没有包含“时间戳”,也会显示“不可用”。不要紧张,这里显示的“不可用”跟数字签名的有效性没关系。

一般来说,签名列表中,有且仅有一个签名。选中它,点“详细信息”按钮。跳出如下界面:
  通常这个界面会显示一行字:该数字签名正常(图中红圈标出)。如果有这行字,就说明该文件从出厂到你手里,中途没有被篡改过(是原装滴、是纯洁滴)。

如果该文件被篡改过了(比如,感染了病毒、被注入木马),那么对话框会出现一个警告提示:该数字签名无效(图中红圈标出),界面如下。一旦出现数字签名无效,那这个文件就不要再使用了。

◇利用命令行工具批量验证

用上面的图形化界面进行验证,比较傻瓜化。但有一个缺点——如果你要验证的文件比较多,一个一个去点对话框,手会抽筋滴。所以,俺再介绍一下命令行的工具,适合进行批量验证。
  这个命令行工具就是微软官网提供的【SigCheck】,由大名鼎鼎的 SysInternals 出品(SysInternals 已经被微软收购)。跟前面提到的 FCIV 类似,它也是一个小巧、绿色、免费的命令行工具,下载页面在“这里”。

使用如下命令,可以批量检查某个目录下(包括多层嵌套子目录)的所有可执行程序,并且把“无签名”或者“签名无效”的文件列出来。
sigcheck -u -e -s 某个目录的路径名
  先提醒一下:
  检查数字签名的有效性本身就比较慢,如果目录下的文件很多,你要有足够的耐心等它运行完毕。

稍微补充一下,这个 SigCheck 命令还顺便提供了散列值(命令格式如下),该功能可替代 FCIV 的头两个功能,可惜无法替代 FCIV 的第三个功能。
sigcheck -h 某个【目录】的路径名
sigcheck -h 某个【文件】的路径名

★PGP/GPG 的数字签名

刚才聊了 Windows 平台滴。但是,切莫以为只有 Windows 平台才提供数字签名——其它的数字签名工具还有好几种。名气比较大的数字签名工具当属 PGP/GPG。这两个缩写就像绕口令,很容易搞混。PGP 是商业软件,而 GPG 是 GnuPG 的缩写,是 GNU 的开源项目。后者是前者的开源替代品,两者的功能基本兼容。
  这俩玩意儿的功能很强悍,校验数字签名对它俩只是小菜一碟。考虑到大伙儿平时较少碰到 GPG 的签名,俺今天就偷懒一下,暂不介绍。以后如果有空,再专门写一篇帖子介绍 PGP/GPG 的各种功能和使用场景。

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。