// Rebuild the original data without the hash SetLength(Parts, Length(Parts) - 1); CalculatedHash := THashSHA2.GetHashString(string.Join('|', Parts), SHA256);
if CalculatedHash <> HashPart then Exit; file activation delphi 2016
// Verify machine binding if MachineIDPart <> GetMachineID then Exit; // Rebuild the original data without the hash
function ValidateActivationFile(const FileName: string): Boolean; var Lines: TStringList; Decoded, MachineIDPart, HashPart, CalculatedHash: string; Parts: TArray<string>; begin Result := False; if not FileExists(FileName) then Exit; Lines := TStringList.Create; try Lines.LoadFromFile(FileName); if Lines.Count = 0 then Exit; Decoded := TNetEncoding.Base64.Decode(Lines[0]); Parts := Decoded.Split(['|']); if Length(Parts) < 3 then Exit; uses System
uses Winapi.Windows, System.SysUtils, System.Classes; function GetMachineID: string; var VolumeSerial: DWORD; MaxCompLen, FileSysFlags: DWORD; RootPath: string; ComputerName: array[0..MAX_COMPUTERNAME_LENGTH + 1] of Char; Size: DWORD; begin RootPath := 'C:'; GetVolumeInformation(PChar(RootPath), nil, 0, @VolumeSerial, MaxCompLen, FileSysFlags, nil, 0); Size := MAX_COMPUTERNAME_LENGTH + 1; GetComputerName(ComputerName, Size); Result := Format('%d-%s', [VolumeSerial, string(ComputerName)]); end; ⚠️ Note: For production, combine multiple identifiers (MAC address, processor ID) to avoid false positives. On your server (or within an admin tool), encrypt the machine ID along with expiration date and features. Use System.NetEncoding and a strong cipher (e.g., Delphi's TCipher_AES from System.Encryption ).
uses System.NetEncoding, System.Hash; function GenerateActivationFile(const MachineID, UserEmail: string; ExpireDays: Integer): string; var ExpireDate: TDateTime; RawData, HashData: string; begin ExpireDate := Now + ExpireDays; RawData := Format('%s|%s|%s', [MachineID, UserEmail, DateToStr(ExpireDate)]); HashData := THashSHA2.GetHashString(RawData, SHA256); Result := TNetEncoding.Base64.Encode(RawData + '|' + HashData); // Save Result to a file, e.g., "activation.key" end;