基于C#實現簡單離線注冊碼生成與驗證
主要思路就是提供者持有密鑰,通過RSA加密客戶機標識或時間標識,再通過Base64加密成不太難看的注冊碼,然后分發(fā)給客戶機。
客戶機解Base64后,通過持有的公鑰來驗證注冊碼是否與本機標識或時間標識相符。
一、 生成公密鑰
RSACryptoServiceProvider cryptor = new RSACryptoServiceProvider();
File.WriteAllText("PrivateKey.xml", cryptor.ToXmlString(true));
File.WriteAllText("PublicKey.xml", cryptor.ToXmlString(false));
為了方便長期保存這里就直接存入文件了。
為了避免客戶機公鑰丟失,我比較傾向于將公鑰直接編譯到驗證程序中,但是這樣也就意味著如果更換了密鑰,老的驗證程序就驗不了新生成的注冊碼了。
二、 生成注冊碼
static string CreateRegCode(string mac, DateTime date) { RSACryptoServiceProvider cryptor = new RSACryptoServiceProvider(); cryptor.FromXmlString(File.ReadAllText("PrivateKey.xml")); string signature = String.Format("[{}][{}]", mac, date.ToString("yyyy-MM-dd")); byte[] regCodeBytes = cryptor.SignData( Encoding.UTF.GetBytes(signature), "SHA"); return Convert.ToBaseString(regCodeBytes); }
這個方法是通過加密MAC和日期的組合來生成注冊碼,需要注意幾點:
1.參數中的MAC是客戶機的地址2.第四行的文件是上一步生成的密鑰文件
3.由于只考慮驗證,所以客戶機還必須知道參數中的date
三、 驗證注冊碼
static bool Verify(string regCode) { const string PUBLIC_KEY = ""; try { RSACryptoServiceProvider cryptor = new RSACryptoServiceProvider(); cryptor.FromXmlString(PUBLIC_KEY); byte[] signedData = Convert.FromBaseString(regCode); bool today = cryptor.VerifyData( Encoding.UTF.GetBytes(String.Format("[{}][{}]", DateTime.Now.ToString("yyyy-MM-dd"))), "SHA", signedData); bool machineToday = cryptor.VerifyData( Encoding.UTF.GetBytes(String.Format("[{}][{}]", MAC, DateTime.Now.ToString("yyyy-MM-dd"))), "SHA", signedData); bool forever = cryptor.VerifyData( Encoding.UTF.GetBytes(String.Format("[{}][{}]", MAC, Environment.MachineName)), "SHA", signedData); return today || machineToday || forever; } catch { return false; } }
這個方法驗證了三種類型的注冊碼:當天可用、本機當天可用和永久可用。
需要注意:
1.第三行的公鑰就是第一步的PublicKey.xml中的內容
2.十四和十七行的MAC是客戶機的物理地址,至于怎么獲取不是本文的重點,請各位看官自行百度
3.考慮到客戶機填寫的注冊碼有可能不是合法的Base64文本,需要捕獲解析時異常
其實RSACryptoServiceProvider也提供了解密的方法,這樣就可以驗證更多種類的驗證碼了。
相關文章
C# FileSystemWatcher 在監(jiān)控文件夾和文件時的使用方法
這篇文章主要介紹了C# FileSystemWatcher 在監(jiān)控文件夾和文件時的使用方法,文中講解非常細致,代碼幫助大家更好的理解和學習,感興趣的朋友可以參考下2020-06-06C#實現定義一套中間SQL可以跨庫執(zhí)行的SQL語句(案例詳解)
這篇文章主要介紹了C#實現定義一套中間SQL可以跨庫執(zhí)行的SQL語句,主要包括hisql查詢樣例、group by查詢、鏈式查詢及hisql語句和鏈式查詢混用的sql語句,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2022-07-07C#中如何自定義配置上周和本周起始日來查詢業(yè)務數據(思路詳解)
在C#中并沒有封裝的方法根據我們需要來直接獲取上一周某天到某天、本周某天到某天,所以需要我們自己封裝方法來實現(我們也可以按照這個思路使用其他語言來實現),感興趣的朋友跟隨小編一起看看吧2023-09-09