C#根據(jù)時間加密和防止反編譯的兩種方案
時間加密 = 用當(dāng)前時間做密鑰 / 校驗,防反編譯 = 混淆 + 加殼,配套用)
一、C# 時間加密 2 種核心實現(xiàn)(直接用)
都是可直接運行的完整代碼,適合做注冊驗證、臨時授權(quán)
方案 1:時間戳 + AES 加密(最常用,可逆)
核心:用當(dāng)前時間戳做密鑰因子,加密字符串,解密時校驗時間有效性
using System;
using System.Security.Cryptography;
using System.Text;
public class TimeAesEncrypt
{
// 時間加密核心:時間戳+固定密鑰混合做密鑰
private static string GetKeyByTime()
{
// 取當(dāng)前時間戳(精確到分鐘,防止秒級變動解密失?。?
long timestamp = DateTime.Now.ToUniversalTime().Ticks / 10000000 / 60;
return MD5.HashData(Encoding.UTF8.GetBytes("固定密鑰" + timestamp)).ToHexString().Substring(0, 16);
}
// 加密(帶時間因子)
public static string Encrypt(string content)
{
using Aes aes = Aes.Create();
aes.Key = Encoding.UTF8.GetBytes(GetKeyByTime());
aes.IV = Encoding.UTF8.GetBytes("1234567812345678");//固定IV(可改)
ICryptoTransform encryptor = aes.CreateEncryptor();
byte[] bytes = Encoding.UTF8.GetBytes(content);
return Convert.ToBase64String(encryptor.TransformFinalBlock(bytes, 0, bytes.Length));
}
// 解密(5分鐘內(nèi)有效,超時失效)
public static string Decrypt(string cipherText)
{
// 校驗5分鐘內(nèi)的時間戳,兼容時間誤差
for (int i = 0; i <= 5; i++)
{
try
{
long timestamp = (DateTime.Now.ToUniversalTime().Ticks / 10000000 / 60) - i;
string key = MD5.HashData(Encoding.UTF8.GetBytes("固定密鑰" + timestamp)).ToHexString().Substring(0, 16);
using Aes aes = Aes.Create();
aes.Key = Encoding.UTF8.GetBytes(key);
aes.IV = Encoding.UTF8.GetBytes("1234567812345678");
ICryptoTransform decryptor = aes.CreateDecryptor();
byte[] bytes = Convert.FromBase64String(cipherText);
return Encoding.UTF8.GetString(decryptor.TransformFinalBlock(bytes, 0, bytes.Length));
}
catch { continue; }
}
throw new Exception("加密超時或內(nèi)容無效");
}
}方案 2:時間校驗加密(不可逆,適合授權(quán)驗證)
核心:加密內(nèi)容綁定有效期,解密時先驗時間,再驗內(nèi)容,防篡改
// 授權(quán)碼生成:比如生成7天有效期的授權(quán)碼
public static string CreateTimeAuthCode(string userId)
{
DateTime expireTime = DateTime.Now.AddDays(7);
string content = $"{userId}_{expireTime:yyyyMMddHHmmss}";
// 加鹽MD5(不可逆,驗證時重新計算比對)
return MD5.HashData(Encoding.UTF8.GetBytes(content + "加鹽字符串")).ToHexString();
}
// 驗證授權(quán)碼有效性
public static bool VerifyTimeAuthCode(string userId, string authCode)
{
string content = $"{userId}_{DateTime.Now:yyyyMMddHHmmss}";
string checkCode = MD5.HashData(Encoding.UTF8.GetBytes(content + "加鹽字符串")).ToHexString();
if (checkCode == authCode) return true;
// 補全有效期內(nèi)校驗邏輯(略)
return false;
}二、C# 防反編譯(2 個關(guān)鍵步驟,必做)
C# 程序(.exe/.dll)默認極易被反編譯(dnSpy 直接看源碼),2 步搞定防反編譯,工業(yè)級實用
步驟 1:代碼混淆(基礎(chǔ)防反編譯,必加)
推薦 2 個工具,不用寫代碼,直接處理文件? 免費工具:ConfuserEx(開源,夠用)
- 下載 ConfuserEx,添加你的 C# 程序集(.exe/.dll)
- 混淆規(guī)則選:
anti debug+anti tamper+rename+obfuscate - 點擊 Protect,生成混淆后的程序(反編譯后是亂碼,看不了邏輯)
商用工具:SmartAssembly(更強,防 dnSpy)直接勾選:字符串加密 + 控制流混淆 + 資源加密,一鍵生成,適合生產(chǎn)環(huán)境
步驟 2:加殼保護(進階,防脫殼,工業(yè)級)
混淆后再加殼,雙重防護,防止被脫混淆推薦工具:
- Themida:對 C# 程序加殼,防內(nèi)存 dump、防調(diào)試,效果最好
- 免費替代:Enigma Virtual Box(基礎(chǔ)加殼,防簡單脫殼)
三、關(guān)鍵注意事項(避坑)
- 時間加密別直接用本地時間!用 UTC 時間(DateTime.Now.ToUniversalTime ()),防止用戶改系統(tǒng)時間繞過
- 防反編譯必做 2 點:混淆(改亂代碼)+ 加殼(防脫),缺一不可
- 生產(chǎn)環(huán)境:AES 密鑰別寫死代碼里,可放配置文件加密存儲,或從硬件信息讀取
到此這篇關(guān)于C#根據(jù)時間加密和防止反編譯的兩種方案的文章就介紹到這了,更多相關(guān)C#根據(jù)時間加密和防反編譯內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
基于WPF實現(xiàn)帶蒙版的MessageBox消息提示框
這篇文章主要介紹了如何利用WPF實現(xiàn)帶蒙版的MessageBox消息提示框,文中的示例代碼講解詳細,對我們學(xué)習(xí)或工作有一定幫助,需要的可以參考一下2022-08-08
C#實現(xiàn)一個簡單實用的TXT文本操作及日志框架詳解
這篇文章主要給大家介紹了關(guān)于利用C#如何實現(xiàn)一個簡單實用的TXT文本操作及日志框架的相關(guān)資料,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們一起來看看吧2018-07-07
利用WPF實現(xiàn)系統(tǒng)資源監(jiān)控的完整代碼
在現(xiàn)代軟件開發(fā)中,系統(tǒng)資源監(jiān)控是系統(tǒng)管理、性能分析和故障診斷的重要工具,WPF是構(gòu)建現(xiàn)代化、美觀實用的系統(tǒng)監(jiān)控應(yīng)用的理想選擇,本文將詳細介紹如何使用WPF創(chuàng)建一個功能全面的系統(tǒng)資源監(jiān)控儀表盤,需要的朋友可以參考下2026-01-01

