C#注冊(cè)碼生成與驗(yàn)證機(jī)制實(shí)現(xiàn)方案
一、核心架構(gòu)設(shè)計(jì)

二、關(guān)鍵實(shí)現(xiàn)步驟
1. 硬件信息采集(唯一性保障)
// 獲取CPU序列號(hào)(需引用System.Management)
public string GetCpuId() {
using (ManagementObjectSearcher searcher =
new ManagementObjectSearcher("SELECT ProcessorId FROM Win32_Processor")) {
return searcher.Get().OfType<ManagementObject>().First()?
.Properties["ProcessorId"].Value.ToString() ?? "N/A";
}
}
// 獲取硬盤卷標(biāo)(物理磁盤)
public string GetDiskId() {
using (ManagementObjectSearcher searcher =
new ManagementObjectSearcher("SELECT SerialNumber FROM Win32_PhysicalMedia")) {
return searcher.Get().OfType<ManagementObject>().First()?
.Properties["SerialNumber"].Value.ToString() ?? "N/A";
}
}
// 獲取網(wǎng)卡MAC地址(優(yōu)先以太網(wǎng))
public string GetMacAddress() {
var nic = NetworkInterface.GetAllNetworkInterfaces()
.FirstOrDefault(n => n.NetworkInterfaceType == NetworkInterfaceType.Ethernet);
return nic?.GetPhysicalAddress().ToString() ?? "00:00:00:00:00:00";
}
硬件指紋組合策略:CPUID + DiskID + MAC
2. 機(jī)器碼生成算法
// 哈希算法生成(SHA256)
public string GenerateMachineCode() {
string hardwareInfo = $"{GetCpuId()}{GetDiskId()}{GetMacAddress()}";
using (SHA256 sha256 = SHA256.Create()) {
byte[] hash = sha256.ComputeHash(Encoding.UTF8.GetBytes(hardwareInfo));
return BitConverter.ToString(hash).Replace("-", "").ToLower();
}
}
優(yōu)勢(shì):抗碰撞性強(qiáng),適合分布式系統(tǒng)
3. 注冊(cè)碼生成(多算法支持)
3.1 對(duì)稱加密方案(DES)
// 生成帶有效期的注冊(cè)碼
public string GenerateRegisterCode(string machineCode, int daysValid) {
DateTime expireDate = DateTime.Now.AddDays(daysValid);
string data = $"{machineCode}|{expireDate:yyyyMMdd}";
using (DESCryptoServiceProvider des = new DESCryptoServiceProvider()) {
des.Key = Encoding.UTF8.GetBytes("YourSecretKey123"); // 16字節(jié)密鑰
des.IV = Encoding.UTF8.GetBytes("InitVector0123"); // 16字節(jié)IV
using (MemoryStream ms = new MemoryStream()) {
using (CryptoStream cs = new CryptoStream(ms, des.CreateEncryptor(), CryptoStreamMode.Write)) {
byte[] inputBytes = Encoding.UTF8.GetBytes(data);
cs.Write(inputBytes, 0, inputBytes.Length);
}
return Convert.ToBase64String(ms.ToArray());
}
}
}
特點(diǎn):快速加密,密鑰需硬編碼保護(hù)
3.2 非對(duì)稱加密方案(RSA)
// 生成RSA密鑰對(duì)
public void GenerateRSAKeys() {
using (RSACryptoServiceProvider rsa = new RSACryptoServiceProvider(2048)) {
File.WriteAllText("PrivateKey.xml", rsa.ToXmlString(true)); // 私鑰
File.WriteAllText("PublicKey.xml", rsa.ToXmlString(false)); // 公鑰
}
}
// 生成注冊(cè)碼(私鑰簽名)
public string GenerateRSACode(string machineCode) {
using (RSACryptoServiceProvider rsa = new RSACryptoServiceProvider()) {
rsa.FromXmlString(File.ReadAllText("PrivateKey.xml"));
SHA1Managed sha = new SHA1Managed();
byte[] data = Encoding.UTF8.GetBytes(machineCode);
byte[] hash = sha.ComputeHash(data);
return Convert.ToBase64String(rsa.SignHash(hash, CryptoConfig.MapNameToOID("SHA1")));
}
}
// 驗(yàn)證注冊(cè)碼(公鑰驗(yàn)證)
public bool ValidateRSACode(string code, string machineCode) {
using (RSACryptoServiceProvider rsa = new RSACryptoServiceProvider()) {
rsa.FromXmlString(File.ReadAllText("PublicKey.xml"));
SHA1Managed sha = new SHA1Managed();
byte[] data = Encoding.UTF8.GetBytes(machineCode);
byte[] hash = sha.ComputeHash(data);
byte[] signature = Convert.FromBase64String(code);
return rsa.VerifyHash(signature, CryptoConfig.MapNameToOID("SHA1"), hash);
}
}
優(yōu)勢(shì):不可逆加密,適合高安全場(chǎng)景
4. 注冊(cè)信息存儲(chǔ)
// 注冊(cè)表存儲(chǔ)(兼容Win10)
public void SaveRegistration(string code) {
using (RegistryKey key = Registry.CurrentUser.CreateSubKey(@"Software\YourApp")) {
key.SetValue("RegisterCode", code);
key.SetValue("RegisteredDate", DateTime.Now.ToString());
key.SetValue("HardwareFingerprint", GenerateMachineCode());
}
}
// 文件存儲(chǔ)(加密存儲(chǔ))
public void SaveToFile(string code) {
string encrypted = AES_Encrypt(code, "FileKey123");
File.WriteAllText("license.dat", encrypted);
}
5. 驗(yàn)證邏輯實(shí)現(xiàn)
// 綜合驗(yàn)證(有效期+硬件綁定)
public bool FullValidation(string inputCode) {
// 1. 解密獲取原始信息
string decrypted = AES_Decrypt(inputCode, "YourSecretKey123");
string[] parts = decrypted.Split('|');
string machineCode = parts[0];
DateTime expireDate = DateTime.Parse(parts[1]);
// 2. 硬件校驗(yàn)
if (GenerateMachineCode() != machineCode) return false;
// 3. 時(shí)間校驗(yàn)
if (DateTime.Now > expireDate) return false;
// 4. 在線驗(yàn)證(可選)
if (!CheckOnlineStatus(machineCode)) return false;
return true;
}
三、安全增強(qiáng)策略
1. 反調(diào)試保護(hù)
protected override void OnLoad(EventArgs e) {
base.OnLoad(e);
// 檢測(cè)調(diào)試器
if (Debugger.IsAttached || CheckRemoteDebuggerPresent()) {
Application.Exit();
}
// 內(nèi)存保護(hù)
NativeMethods.VirtualProtect(
Marshal.AllocHGlobal(1024),
1024,
NativeMethods.PAGE_READONLY,
out _);
}
2. 代碼混淆方案
// 控制流混淆示例
private int ObfuscatedCheck() {
int a = 0x5A5A5A5A;
int b = 0xA5A5A5A5;
for(int i=0; i<10; i++) {
a = (a ^ b) + (i << 3);
b = (b ^ a) - (i >> 1);
}
return a ^ b;
}
工具建議:Dotfuscator、SmartAssembly
3. 完整性校驗(yàn)
public bool CheckIntegrity() {
string checksum = CalculateFileChecksum(Assembly.GetExecutingAssembly().Location);
return checksum == savedChecksum;
}
private string CalculateFileChecksum(string path) {
using (var sha256 = SHA256.Create()) {
using (var stream = File.OpenRead(path)) {
return BitConverter.ToString(sha256.ComputeHash(stream)).Replace("-", "");
}
}
}
參考代碼 C# 注冊(cè)碼以及注冊(cè)機(jī)制 實(shí)例源碼 www.youwenfan.com/contentcsr/37250.html
四、擴(kuò)展功能實(shí)現(xiàn)
1. 在線激活服務(wù)
public async Task<bool> OnlineActivate(string machineCode) {
using (var client = new HttpClient()) {
var response = await client.PostAsync(
"https://api.yourserver.com/activate",
new StringContent($"{{\"machineCode\":\"{machineCode}\"}}"));
return response.IsSuccessStatusCode;
}
}
2. 多設(shè)備綁定
// 生成多設(shè)備注冊(cè)碼(支持5臺(tái)設(shè)備)
public string GenerateMultiDeviceCode(string baseCode) {
string[] devices = File.ReadAllLines("devices.txt");
string combined = string.Join("_", devices.Take(5));
return GenerateRSACode($"{baseCode}|{combined}");
}
五、測(cè)試用例設(shè)計(jì)
| 測(cè)試場(chǎng)景 | 輸入數(shù)據(jù) | 預(yù)期結(jié)果 |
|---|---|---|
| 有效注冊(cè)碼驗(yàn)證 | 正確機(jī)器碼+未過期 | 驗(yàn)證通過 |
| 硬件變更檢測(cè) | 更換網(wǎng)卡后啟動(dòng) | 彈出重新激活提示 |
| 注冊(cè)碼篡改檢測(cè) | 修改Base64編碼中的字符 | 校驗(yàn)失敗 |
| 并發(fā)驗(yàn)證性能 | 1000次/秒驗(yàn)證請(qǐng)求 | 響應(yīng)時(shí)間<50ms |
以上就是C#注冊(cè)碼生成與驗(yàn)證機(jī)制實(shí)現(xiàn)方案的詳細(xì)內(nèi)容,更多關(guān)于C#注冊(cè)碼生成與驗(yàn)證機(jī)制的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
C#函數(shù)參數(shù)修飾符out和in的用法詳解
在 C# 中,out 和 in 是兩種非常有用的參數(shù)修飾符,它們各自有著獨(dú)特的用途和優(yōu)勢(shì),能夠極大地提升我們的編程體驗(yàn),或許很多人對(duì)這兩個(gè)修飾符的作用還不太了解,今天就讓我們一起來揭開它們神秘的面紗吧2025-11-11
DevExpress根據(jù)條件設(shè)置GridControl RepositoryItem是否可編輯
這篇文章主要介紹了DevExpress根據(jù)條件設(shè)置GridControl RepositoryItem是否可編輯,需要的朋友可以參考下2014-08-08
C#中 nameof 和 ToString () 的用法與區(qū)別解析
在 C# 編程過程中,nameof運(yùn)算符和ToString()方法是開發(fā)者經(jīng)常會(huì)用到的功能,本文將通過具體的代碼示例,詳細(xì)介紹nameof和枚舉結(jié)合的用法,以及nameof與ToString()之間的區(qū)別,感興趣的朋友一起看看吧2025-06-06
C# Winform實(shí)現(xiàn)繪制圓形進(jìn)度條
這篇文章主要為大家詳細(xì)介紹了使用C# Winform實(shí)現(xiàn)繪制圓形進(jìn)度條的相關(guān)知識(shí),文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編 一起學(xué)習(xí)一下2024-02-02
C#實(shí)現(xiàn)appSettings節(jié)點(diǎn)讀取與修改的方法
這篇文章主要介紹了C#實(shí)現(xiàn)appSettings節(jié)點(diǎn)讀取與修改的方法,是非常實(shí)用的技巧,需要的朋友可以參考下2014-10-10
Unity實(shí)現(xiàn)人物平滑轉(zhuǎn)身
這篇文章主要為大家詳細(xì)介紹了Unity實(shí)現(xiàn)人物平滑轉(zhuǎn)身,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2020-01-01
Unity 實(shí)現(xiàn)給物體替換材質(zhì)球
這篇文章主要介紹了Unity 實(shí)現(xiàn)給物體替換材質(zhì)球的操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2021-04-04
C#將布爾類型轉(zhuǎn)換成字節(jié)數(shù)組的方法
這篇文章主要介紹了C#將布爾類型轉(zhuǎn)換成字節(jié)數(shù)組的方法,涉及C#中字符串函數(shù)的使用技巧,非常具有實(shí)用價(jià)值,需要的朋友可以參考下2015-04-04

