如何在Inno Setup安装向导中展示BIOS序列号加盐哈希值并添加密码输入框
Inno Setup实现BIOS序列号加盐哈希展示与密码输入页方案
1. 核心功能实现逻辑
- 无需调用外部
wmic命令,直接通过Inno Setup的Pascal脚本内置的WMI对象获取BIOS序列号,稳定性更高,避免命令行输出解析异常 - 哈希计算直接在脚本内完成,加盐逻辑可自行修改固定盐值
- 自定义向导页同时放置哈希值只读展示框、密码输入框两个组件
2. 完整可复用代码片段
你可以直接将以下代码添加到你的Inno Setup脚本的[Code]段中:
[Code] // 自定义全局变量 var CustomPage: TWizardPage; SerialHashEdit: TEdit; PasswordEdit: TEdit; Salt: string; // 计算SHA256哈希的辅助函数 function GetSHA256Hash(const Input: string): string; var HashAlgorithm: Variant; HashBytes: array of Byte; I: Integer; begin HashAlgorithm := CreateOleObject('System.Security.Cryptography.SHA256Managed'); HashBytes := HashAlgorithm.ComputeHash_2((UTF8Encode(Input))); Result := ''; for I := 0 to Length(HashBytes) - 1 do Result := Result + Format('%02x', [HashBytes[I]]); end; // 获取BIOS序列号的辅助函数 function GetBIOSSerialNumber: string; var WMI, Items, Item: Variant; I: Integer; begin Result := ''; try WMI := CreateOleObject('WbemScripting.SWbemLocator.1').ConnectServer('.', 'root\cimv2'); Items := WMI.ExecQuery('SELECT SerialNumber FROM Win32_BIOS'); for I := 0 to Items.Count - 1 do begin Item := Items.ItemIndex(I); Result := Trim(Item.SerialNumber); if Result <> '' then Break; end; except // 异常情况下返回空字符串,你可以根据需求调整异常处理逻辑 Result := ''; end; end; // 初始化自定义向导页 procedure InitializeWizard; var SerialNumber, HashValue: string; SerialHashLabel, PasswordLabel: TLabel; begin // 这里设置你自己的固定盐值 Salt := 'YourCustomSalt2024!@#'; // 创建自定义向导页,放在欢迎页之后,你也可以调整位置参数 CustomPage := CreateCustomPage(wpWelcome, '设备验证与密码设置', '请确认设备哈希值并输入安装密码'); // 构建BIOS序列号加盐哈希 SerialNumber := GetBIOSSerialNumber; HashValue := GetSHA256Hash(SerialNumber + Salt); // 添加BIOS哈希值展示标签 SerialHashLabel := TLabel.Create(CustomPage); SerialHashLabel.Parent := CustomPage.Surface; SerialHashLabel.Left := 0; SerialHashLabel.Top := 0; SerialHashLabel.Caption := '当前设备BIOS加盐哈希值:'; SerialHashLabel.Font.Style := [fsBold]; // 添加只读编辑框展示哈希值 SerialHashEdit := TEdit.Create(CustomPage); SerialHashEdit.Parent := CustomPage.Surface; SerialHashEdit.Left := 0; SerialHashEdit.Top := SerialHashLabel.Top + SerialHashLabel.Height + 4; SerialHashEdit.Width := CustomPage.SurfaceWidth; SerialHashEdit.ReadOnly := True; SerialHashEdit.Text := HashValue; // 添加密码输入标签 PasswordLabel := TLabel.Create(CustomPage); PasswordLabel.Parent := CustomPage.Surface; PasswordLabel.Left := 0; PasswordLabel.Top := SerialHashEdit.Top + SerialHashEdit.Height + 16; PasswordLabel.Caption := '请输入安装密码:'; PasswordLabel.Font.Style := [fsBold]; // 添加密码输入框 PasswordEdit := TEdit.Create(CustomPage); PasswordEdit.Parent := CustomPage.Surface; PasswordEdit.Left := 0; PasswordEdit.Top := PasswordLabel.Top + PasswordLabel.Height + 4; PasswordEdit.Width := CustomPage.SurfaceWidth; PasswordEdit.PasswordChar := '*'; // 输入内容隐藏为星号 end; // 可选:添加密码校验逻辑,点击下一步时验证密码是否正确 function NextButtonClick(CurPageID: Integer): Boolean; var CorrectPassword: string; begin Result := True; if CurPageID = CustomPage.ID then begin // 这里可以根据哈希值生成对应正确密码,示例为直接写死校验逻辑 CorrectPassword := GetSHA256Hash(SerialHashEdit.Text + 'YourPasswordSalt'); if PasswordEdit.Text <> CorrectPassword then begin MsgBox('输入的密码不正确,请重新输入', mbError, MB_OK); Result := False; end; end; end;
3. 可调整参数说明
- 你可以修改
Salt变量的取值,更换为你专属的加盐字符串,避免哈希值被逆向 - 可以调整
CreateCustomPage的第一个参数,修改自定义页面在安装向导中的出现位置 - 可以自行修改
NextButtonClick中的密码校验逻辑,适配你自己的密码生成规则
内容的提问来源于stack exchange,提问作者HDTV
相关产品推荐
相关产品推荐

