如何在Inno Setup中通过验证文件哈希限制安装流程?
在Inno Setup中实现文件哈希验证以控制安装流程
核心思路是:将你创建的文件选择页设为全局变量,在用户点击「下一步」时读取选中文件、计算MD5哈希,与预期值对比——不匹配则阻止安装流程继续。
以下是完整的实现代码,直接替换你现有[Code]段即可:
[Code] var ROMFilePage: TInputFileWizardPage; // 替换成你需要验证的MD5哈希值 ExpectedROMHash: string = '填入你的预期MD5哈希'; procedure InitializeWizard; begin ROMFilePage := CreateInputFilePage(wpWelcome, '选择SMB1 ROM文件', '需要合法获取的SMB1 ROM才能继续安装', '点击“浏览...”选择你的SMB1 ROM文件,然后点击下一步。'); ROMFilePage.Add('&SMB1 ROM文件:', '.NES|*.nes|.NEZ|*.nez|.UNF|*.unif|.UNIF|*.unif', '.nes'); end; function NextButtonClick(CurPageID: Integer): Boolean; var ROMFilePath: string; ROMContent: string; CalculatedHash: string; begin Result := True; // 仅在当前页是ROM选择页时执行验证 if CurPageID = ROMFilePage.ID then begin ROMFilePath := ROMFilePage.Values[0]; // 双重校验文件有效性 if not FileExists(ROMFilePath) then begin MsgBox('请选择有效的SMB1 ROM文件。', mbError, MB_OK); Result := False; Exit; end; // 读取ROM文件内容(40KB大小无内存压力) if not LoadStringFromFile(ROMFilePath, ROMContent) then begin MsgBox('无法读取所选ROM文件,请检查文件权限或完整性。', mbError, MB_OK); Result := False; Exit; end; // 计算文件MD5哈希并对比 CalculatedHash := GetMD5OfString(ROMContent); if UpperCase(CalculatedHash) <> UpperCase(ExpectedROMHash) then begin MsgBox('所选ROM文件不符合要求,请检查文件是否正确。', mbError, MB_OK); Result := False; Exit; end; end; end;
关键说明
- 全局变量
ROMFilePage:让NextButtonClick事件能访问到用户选择的文件路径,解决局部变量无法跨事件访问的问题。 NextButtonClick事件拦截:这是Inno Setup内置的流程拦截点,返回False即可阻止页面跳转,实现验证不通过时无法继续安装。- 哈希对比逻辑:统一转成大写对比,避免MD5哈希大小写书写差异导致的验证失败。
内容的提问来源于stack exchange,提问作者Amy
相关产品推荐
相关产品推荐

