亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

基于C#實(shí)現(xiàn)簡單離線注冊(cè)碼生成與驗(yàn)證

 更新時(shí)間:2015年09月28日 15:01:58   投稿:mrr  
本文使用RSA非對(duì)稱加密和Base64簡單地實(shí)現(xiàn)離線注冊(cè)碼的生成與驗(yàn)證功能。感興趣的朋友跟著小編一起學(xué)習(xí)吧

主要思路就是提供者持有密鑰,通過RSA加密客戶機(jī)標(biāo)識(shí)或時(shí)間標(biāo)識(shí),再通過Base64加密成不太難看的注冊(cè)碼,然后分發(fā)給客戶機(jī)。

客戶機(jī)解Base64后,通過持有的公鑰來驗(yàn)證注冊(cè)碼是否與本機(jī)標(biāo)識(shí)或時(shí)間標(biāo)識(shí)相符。

一、 生成公密鑰

RSACryptoServiceProvider cryptor = new RSACryptoServiceProvider();
File.WriteAllText("PrivateKey.xml", cryptor.ToXmlString(true));
File.WriteAllText("PublicKey.xml", cryptor.ToXmlString(false));

為了方便長期保存這里就直接存入文件了。

為了避免客戶機(jī)公鑰丟失,我比較傾向于將公鑰直接編譯到驗(yàn)證程序中,但是這樣也就意味著如果更換了密鑰,老的驗(yàn)證程序就驗(yàn)不了新生成的注冊(cè)碼了。

二、 生成注冊(cè)碼

 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);
 }

這個(gè)方法是通過加密MAC和日期的組合來生成注冊(cè)碼,需要注意幾點(diǎn):

1.參數(shù)中的MAC是客戶機(jī)的地址2.第四行的文件是上一步生成的密鑰文件

3.由于只考慮驗(yàn)證,所以客戶機(jī)還必須知道參數(shù)中的date

三、 驗(yàn)證注冊(cè)碼

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;
   }
 }

這個(gè)方法驗(yàn)證了三種類型的注冊(cè)碼:當(dāng)天可用、本機(jī)當(dāng)天可用和永久可用。

需要注意:

1.第三行的公鑰就是第一步的PublicKey.xml中的內(nèi)容

2.十四和十七行的MAC是客戶機(jī)的物理地址,至于怎么獲取不是本文的重點(diǎn),請(qǐng)各位看官自行百度

3.考慮到客戶機(jī)填寫的注冊(cè)碼有可能不是合法的Base64文本,需要捕獲解析時(shí)異常

其實(shí)RSACryptoServiceProvider也提供了解密的方法,這樣就可以驗(yàn)證更多種類的驗(yàn)證碼了。

相關(guān)文章

  • 秒表計(jì)時(shí)器以及STOPWATCH(實(shí)例講解)

    秒表計(jì)時(shí)器以及STOPWATCH(實(shí)例講解)

    下面小編就為大家分享一篇秒表計(jì)時(shí)器以及STOPWATCH(實(shí)例講解),具有很好的參考價(jià)值,希望對(duì)大家有所幫助
    2017-11-11
  • C#實(shí)現(xiàn)將浮點(diǎn)數(shù)表示的貨幣數(shù)量以漢字大寫形式輸出的方法

    C#實(shí)現(xiàn)將浮點(diǎn)數(shù)表示的貨幣數(shù)量以漢字大寫形式輸出的方法

    這篇文章主要介紹了C#實(shí)現(xiàn)將浮點(diǎn)數(shù)表示的貨幣數(shù)量以漢字大寫形式輸出的方法,涉及C#針對(duì)浮點(diǎn)數(shù)的遍歷與字符替換操作技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下
    2015-08-08
  • C#實(shí)現(xiàn)定義一套中間SQL可以跨庫執(zhí)行的SQL語句(案例詳解)

    C#實(shí)現(xiàn)定義一套中間SQL可以跨庫執(zhí)行的SQL語句(案例詳解)

    這篇文章主要介紹了C#實(shí)現(xiàn)定義一套中間SQL可以跨庫執(zhí)行的SQL語句,主要包括hisql查詢樣例、group by查詢、鏈?zhǔn)讲樵兗癶isql語句和鏈?zhǔn)讲樵兓煊玫膕ql語句,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-07-07
  • C# WebClient類用法實(shí)例

    C# WebClient類用法實(shí)例

    這篇文章主要介紹了C# WebClient類用法實(shí)例,本文講解使用WebClient下載文件、OpenWriter打開一個(gè)流使用指定的方法將數(shù)據(jù)寫入到uri以及上傳文件示例,需要的朋友可以參考下
    2015-07-07
  • C#中如何自定義配置上周和本周起始日來查詢業(yè)務(wù)數(shù)據(jù)(思路詳解)

    C#中如何自定義配置上周和本周起始日來查詢業(yè)務(wù)數(shù)據(jù)(思路詳解)

    在C#中并沒有封裝的方法根據(jù)我們需要來直接獲取上一周某天到某天、本周某天到某天,所以需要我們自己封裝方法來實(shí)現(xiàn)(我們也可以按照這個(gè)思路使用其他語言來實(shí)現(xiàn)),感興趣的朋友跟隨小編一起看看吧
    2023-09-09
  • 最新評(píng)論