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

