Birçok masaüstü yazılımı, lisanslama ve cihaz doğrulama işlemleri için HVID (Hardware Identifier) adı verilen donanım tabanlı kimlikleri kullanır. HVID bir bilgisayarı mümkün olduğunca benzersiz, stabil ve taklit edilmesi zor şekilde tanımlamayı amaçlar.
Bu makalemfr keni yazılımlarını geliştiren ve lisanslamada benzersiz bir donanım kimliği oluşturmak için gerekli olabilecek genel kullanıma uygun powershell komutunu paylaşacağım.
Windows işletim sistemi üzerinde PowerShell kullanarak donanım bilgilerine dayalı bir fingerprint oluşturmayı ve bu fingerprint’ten SHA-256 algoritması ile güvenli bir HVID üretmeyi ele alacağız.
HVID Nedir?
HVID, tek bir donanım parçasına değil, genellikle birden fazla donanım bilgisinin birleşimine dayanır. Yaygın olarak kullanılan bileşenler şunlardır:
- Sistem UUID
- BIOS seri numarası
- Anakart seri numarası
- Disk seri numarası (opsiyonel)
Bu değerler birleştirilir ve hash edilerek gerçek donanım bilgileri gizlenir.
Neden PowerShell?
- Windows’ta varsayılan olarak bulunur
- WMIC gibi eski araçların yerini almıştır
- WMI / CIM sınıflarına modern erişim sağlar
- Yönetici yetkisi olmadan çalışabilir
1. Donanım Fingerprint’inin Oluşturulması
İlk adımda, HVID üretiminde kullanılacak ham donanım bilgileri alınır.
Kullanılan Donanım Bileşenleri
- System UUID
- BIOS Serial Number
- BaseBoard (Anakart) Serial Number
PowerShell Komutları
$uuid = (Get-CimInstance Win32_ComputerSystemProduct).UUID
$bios = (Get-CimInstance Win32_BIOS).SerialNumber
$board = (Get-CimInstance Win32_BaseBoard).SerialNumber
Bu değerler | karakteri ile birleştirilerek tek bir fingerprint oluşturulur;
"$uuid|$bios|$board"
Örnek çıktı;

Bu çıktı ham fingerprint olarak adlandırılır ve henüz güvenli değildir.
2. SHA-256 ile HVID (Hash) Üretimi
Ham fingerprint doğrudan kullanılmamalıdır. Bunun yerine kriptografik olarak tek yönlü bir hash algoritması uygulanır.
Bu örnekte SHA-256 kullanıyoruz.
PowerShell ile SHA-256 Hash Üretme
$fp = "$uuid|$bios|$board"
$sha = [System.Security.Cryptography.SHA256]::Create()
$bytes = [System.Text.Encoding]::UTF8.GetBytes($fp)
$hash = $sha.ComputeHash($bytes)
($hash | ForEach-Object { $_.ToString("x2") }) -join ""
Örnek HVID Çıktısı
a3f5c91c1a3b7c3d8e8f6f1e4b1d9c7a0f5c6d8b2e9a1f7d6b4c8e2a1f9d

Bu çıktı:
- Geri döndürülemez
- Donanım bilgilerini gizler
- Lisanslama için güvenlidir