You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.05 09:45:03