使用 Visual Studio 对源代码文件进行哈希处理以确保文件完整性

本文探讨了如何使用 Visual Studio 的编译器对源代码文件进行哈希处理,以验证生成的可执行文件与原始源代码的一致性,确保软件的完整性。通过比较编译器生成的哈希值与源代码文件的哈希值,可以确认可执行代码是否源自特定的源文件,从而增强用户对软件的信任。文章还介绍了相关开关的使用及应用场景。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

对所有编译的软件语言来说,将人类可读代码转换成计算机可读代码都是一项软件保障挑战: 用户如何有信心相信在其计算机上运行的软件程序是根据开发者创建的同一源代码文件生成的呢? 这不一定,即使源代码文件经过行业专家评审,也不例外,因为可能出现开放源代码软件的情况。软件保障的核心是信任经过评审的源代码文件是生成可执行文件的相同源代码文件。

 

在编译和链接过程中,使用特定编程语言(C#、C++、Objective C、Java 等)编写的一组源代码文件被转换成二进制可执行文件,以供在特定体系结构(如 x86、x64、ARM)的计算机上运行。但这种转换可能不具有决定性作用。两组不同的源代码文件可能被转换成两组位完全相同的可执行文件。有时,这是有意而为之。源代码文件内空格或文本注释不一致不得影响编译器生成的二进制代码。另一方面,同一组源代码文件也可能会因不同的编译过程而被转换成不同的可执行文件。无论属于上述哪种情况,问题都在于确定性,即无法确定拥有的文件是否就是所需的文件。


为了解决这个问题,不妨在编译过程中使用 Visual Studio 编译器对源代码文件进行哈希处理。将编译器生成的哈希值与经过检查的源代码文件生成的哈希值进行匹配,可以验证可执行代码是否的确是由特定的源代码文件生成而来。这显然会让用户很受益(实际上,如果其他编译器的供应商也采用了类似方法,那么用户会进一步受益)。本文介绍了用于选择哈希算法的新 Visual Studio 开关、此类哈希可能适用的应用场景,以及如何使用 Visual Studio 生成源代码哈希值。



在编译过程中生成强哈希值

程序数据库 (PDB) 文件是一个单独数据文件,存储用于调试二进制可执行文件的信息。Microsoft 最近将其各种编译器文件哈希运算(如 PDB 文件中嵌入的源哈希值)更新为使用强加密算法。

   

本机代码编译器:Visual Studio 2015 本机 C/C++ 编译器 cl.exe 随附一个新开关 /ZH:{MD5|SHA_256},用于为编译器选择其他哈希算法,从而对源代码文件进行哈希处理。默认开关为 MD5,虽然已知其更容易导致冲突,但仍采用默认开关,因为从计算层面来讲它的哈希值生成成本更低。使用新的开关,编译器可以实现密码强度高于 MD5 的 SHA-256 选项。


如果源代码文件的 SHA-256 哈希值与二进制可执行文件的 PDB 文件中存储的 SHA-256 哈希值一致,就可以确定可执行文件是由相同的源代码文件编译而成,这样所有利益干系人便可以对二进制可执行文件有信心。实际上,二进制可执行文件的 PDB 文件中存储的一组 SHA-256 哈希值全都成为二进制可执行文件的“生成证明”中的标识符,因为这些标识符由“生成”二进制可执行文件的编译器进行注册。  


使用调试接口访问 SDK (bit.ly/2gBqKDo),可以轻松创建简单的工具,如调试信息转储程序 cvdump.exe(可从 bit.ly/2hAUhyy 中获取此程序及其源代码)。可以使用 cvdump.exe 的 -sf 开关查看模块(使用本地生成计算机中的完整路径名称)及其 MD5 或 SHA-256 哈希值的列表,如图 1 中的命令窗口所示。


图 1:使用 cvdump.exe 查看模块及其哈希值


使用旧版 cvdump.exe 查看同一 PDB 文件时,我看到的文字是“0x3”,而不是“SHA_256”。“0x3”值是“SHA_256”的枚举值,更新后的 cvdump.exe 知道如何进行解析。它也是调试接口访问 SDK 的 IDiaSourceFile::get_checksumType 方法返回的同一枚举值。


托管代码编译器:默认情况下,Visual Studio 2015 托管代码 C# 编译器 csc.exe 使用 SHA-1 加密算法计算源文件校验和哈希值,以存储在 PDB 文件中。然而,csc.exe 现在支持使用新的可选“/checksumalgorithm”开关来指定 SHA-256 算法。若要切换到 SHA-256 算法,请使用此选项编译当前目录中的所有 C# 文件,然后将调试信息(包括源文件列表和 SHA-256 哈希值)放入 PDB文件中:


csc /checksumalgorithm:SHA256 /debug+ *.cs


可从 github.com/dotnet/roslyn 中获取属于 .NET 编译器平台 (Roslyn) 开放源代码项目的 csc.exe。有关对文件中 SHA-256 源文件调试校验和算法命令行选择器的支持,请访问 bit.ly/2hd3rF3

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值