針對 .NET 應用程式的授權保護,採用 RSA 非對稱加密演算法是業界經典且有效的方案。本文不贅述加密原理,直接梳理從金鑰生成到驗證邏輯的完整工程化步驟,供開發者快速落地。
使用 RSACryptoServiceProvider 生成一對金鑰:公鑰內嵌於發布的客戶端程式中,用於驗證授權檔;私鑰嚴格保管於伺服器端或授權生成工具中,用於簽發授權碼。
using (var rsa = new RSACryptoServiceProvider())
{
string pubKey = rsa.ToXmlString(false); // 公鑰
string priKey = rsa.ToXmlString(true); // 私鑰
// 安全存儲...
}
綁定硬體資訊以防止授權檔被盜用。常見選擇為 CPU ID,透過 WMI (System.Management) 獲取:
public string GetCpuId()
{
using (var mc = new ManagementClass("Win32_Processor"))
using (var moc = mc.GetInstances())
{
foreach (ManagementObject mo in moc)
return mo.Properties["ProcessorId"].Value.ToString();
}
return null;
}
使用私鑰對「硬體指紋」進行簽名,生成 Base64 編碼的授權碼 (License),可存為 .lic 檔案、寫入註冊表或資料庫。
using (var rsa = new RSACryptoServiceProvider())
{
rsa.FromXmlString(privateKey);
var formatter = new RSAPKCS1SignatureFormatter(rsa) { HashAlgorithm = "SHA1" };
byte[] data = Encoding.ASCII.GetBytes(cpuId);
byte[] hash = new SHA1Managed().ComputeHash(data);
byte[] signature = formatter.CreateSignature(hash);
string licenseCode = Convert.ToBase64String(signature);
// 儲存 licenseCode...
}
在應用程式啟動、核心功能調用等關鍵節點,使用內嵌公鑰驗證授權碼有效性。
using (var rsa = new RSACryptoServiceProvider())
{
rsa.FromXmlString(publicKey);
var deformatter = new RSAPKCS1SignatureDeformatter(rsa) { HashAlgorithm = "SHA1" };
byte[] sig = Convert.FromBase64String(licenseCode);
byte[] hash = new SHA1Managed().ComputeHash(Encoding.ASCII.GetBytes(cpuId));
bool isValid = deformatter.VerifySignature(hash, sig);
// 根據 isValid 決定授權狀態...
}
安全提示:私鑰絕不可洩露;建議對驗證邏輯進行代碼混淆;關鍵路徑可增加反調試檢測。