<output id="qn6qe"></output>

    1. <output id="qn6qe"><tt id="qn6qe"></tt></output>
    2. <strike id="qn6qe"></strike>

      亚洲 日本 欧洲 欧美 视频,日韩中文字幕有码av,一本一道av中文字幕无码,国产线播放免费人成视频播放,人妻少妇偷人无码视频,日夜啪啪一区二区三区,国产尤物精品自在拍视频首页,久热这里只有精品12

      .NET中非對稱加密RSA算法的密鑰保存

       

       

      前面介紹了如何在.NET中使用RSA算法進行數據加密和簽名,很多時候,我們需要重復的使用一組密鑰,因此就需要將這組密鑰保存起來。接下來,我給大家介紹3種在.Net中保存密鑰的方法。

      第一種方法:將密鑰導出保存為本地文件。

      首先要強調的是,出于安全性考慮,不建議使用這種方法保存私鑰,如果使用,請在密鑰導出的時候只導出公鑰。

      RSACryptoServiceProvider對象提供了一個ToXmlString(bool includePrivateParameters)方法,我們可以使用此方法將密鑰導出為一個xml格式的string,然后將其保存到一個文件中,這個方法的參數為true時會導出私鑰,否則不導出私鑰。需要的時候,我們可以使用FromXmlString(string xmlString)方法,將保存的密鑰信息加載到RSACryptoServiceProvider對象中。下面的代碼實現了導出和導入操作:

         1: static void SaveKey2File(RSACryptoServiceProvider rsa, string fileName)
         2: {
         3:     FileStream fs = new FileStream(fileName, FileMode.Create, FileAccess.Write);
         4:     string key = rsa.ToXmlString(false);
         5:     fs.Write(Encoding.UTF8.GetBytes(key), 0, key.Length);
         6:     fs.Close();
         7:     fs.Dispose();
         8: }
         9:  
        10: static void LoadKeyFromFile(RSACryptoServiceProvider rsa, string fileName)
        11: {
        12:     FileStream fs = new FileStream(fileName, FileMode.Open, FileAccess.Read);
        13:     byte[] data = new byte[fs.Length];
        14:     fs.Read(data, 0, (int)fs.Length);
        15:     fs.Close();
        16:     fs.Dispose();
        17:     rsa.FromXmlString(Encoding.UTF8.GetString(data));
        18: }

      實際的工作中,出于安全性考慮,很少會用的上面的方法保存密鑰,但如果你想看看密鑰長什么樣子,這個方法還是挺有用的~~

      第二種方法:將密鑰保存到密鑰容器。

      什么是密鑰容器(key container)呢?Window系統提供兩種密鑰庫(key store)用來保存密鑰(User Key Store和Machine Key Store),而密鑰容器就是用來保存密鑰的一個單位,每個密鑰容器都包含了一組密鑰對(公鑰和私鑰)和一些其它的信息,例如是否允許導出密鑰,密鑰的種類(Exchange或Signatrue)等等,我們可以通過密鑰容器的名稱來訪問它們。

      使用CspParameters對象創建或使用密鑰容器:

         1: //實例化CspParameters對象
         2: CspParameters cspPara = new CspParameters();
         3: //指定CspParameters對象實例的名稱
         4: cspPara.KeyContainerName = "key_container_test";
         5: //設置密鑰類型為Exchange
         6: cspPara.KeyNumber = 1;
         7: //設置密鑰容器保存到計算機密鑰庫(默認為用戶密鑰庫)
         8: cspPara.Flags = CspProviderFlags.UseMachineKeyStore;
         9: //實例化RSA對象的時候,將CspParameters對象作為構造函數的參數傳遞給RSA對象,
        10: //如果名稱為key_container_test的密鑰容器不存在,RSA對象會創建這個密鑰容器;
        11: //如果名稱為key_container_test的密鑰容器已經存在,RSA對象會使用這個密鑰容器中的密鑰進行實例化
        12: RSACryptoServiceProvider rsaPro = new RSACryptoServiceProvider(cspPara);
        13:  

       

      刪除密鑰容器:當我們不再需要某個密鑰容器的時候,可以使用下面的方法進行刪除。

         1: CspParameters cspPara = new CspParameters();
         2: cspPara.KeyContainerName = "key_container_test";
         3: cspPara.Flags = CspProviderFlags.UseMachineKeyStore;
         4: RSACryptoServiceProvider rsaPro = new RSACryptoServiceProvider(cspPara);
         5: //不在密鑰庫中保存此密鑰容器
         6: rsaPro.PersistKeyInCsp = false;
         7: //釋放rsaPro占用的所有資源,包括密鑰容器。
         8: rsaPro.Clear();

      除非知道密鑰容器的名稱,否則無法從密鑰庫中提取到這個密鑰容器,所以在本機使用的密鑰(尤其是私鑰)保存在密鑰容器中是比較安全的做法。

      注:實際當我們實例化一個RSACryptoServiceProvider 對象的時候,如果不指定具體的CspParameters 對象,RSACryptoServiceProvider 對象會生成一個臨時的密鑰容器,并且在RSACryptoServiceProvider 對象銷毀的時候自動刪除這個臨時的密鑰容器。

      第三種方法:使用數字證書。

       

       

       

      如果你的密鑰需要在不同的機器上使用,那么將密鑰保存在數字證書中是一個不錯的選擇。實際上,說將密鑰保存在數字證書中并不準確,應該是先生成一個數字證書,然后在使用數字證書中的密鑰。

      如何生成一個數字證書呢?正式的數字證書需要到CA去申請,當然還要奉上一筆銀子。還好我們可以使用.Net SDK提供的MakeCert.exe來生成臨時的數字證書。具體如何生成請訪問證書創建工具

      .Net中用來訪問證書的對象是X509Certificate2,我們可以用它來加載一個數字證書并獲得數字證書中的密鑰。

      如果證書是以文件的形式保存在本地的話,可以用下面的方法加載:

         1: static byte[] EncryptDataByCert(byte[] data)
         2: { 
         3:     //實例化一個X509Certificate2對象,并加載證書testCertificate.cer
         4:     X509Certificate2 cert = new X509Certificate2(@"c:\testCertificate.cer");
         5:     //將證書的公鑰強制轉換成一個RSACryptoServiceProvider對象,然后可以使用這個對象執行加密操作
         6:     RSACryptoServiceProvider rsa = (RSACryptoServiceProvider)cert.PublicKey.Key;
         7:     byte[] enData = rsa.Encrypt(data, false);
         8:     return enData;
         9: }

      一般情況下,對于數字證書來說,保存公鑰的證書使用.cer做擴展名,而保存了私鑰的證書會使用.pfx做擴展名,當我們加載一個私鑰的數字證書時,需要提供私鑰的保護密碼,代碼如下:

         1: static string DecryptByCert(byte[] endata)
         2: {
         3:     //實例化一個X509Certificate2對象,并加載證書testCertificate.pfx。
         4:     //由于證書testCertificate.pfx包含私鑰,所以需要提供私鑰的保護密碼(第二個參數)
         5:     X509Certificate2 cert = new X509Certificate2(@"c:\testCertificate.pfx", "123456");
         6:     //將證書testCertificate.pfx的私鑰強制轉換為一個RSACryptoServiceProvider對象,用于解密操作
         7:     RSACryptoServiceProvider rsa = (RSACryptoServiceProvider)cert.PrivateKey;
         8:     byte[] data = rsa.Decrypt(endata, false);
         9:     return data;
        10: }

      如果證書保存在計算機的證書存儲區(Certificate Store)中,我們就需要使用另一個對象X509Store來訪問證書存儲區。根據訪問權限,證書存儲區分為當前用戶(Current User)和本地計算機(Local Machine)兩個部分,前者用來保存當前登錄的用戶所能使用的數字證書,而后者用來保存登錄到本機所能使用的數字證書。不管是當前用戶還是本地計算機,都包含多個邏輯存儲區,它們通過不同的名稱來區分,每個邏輯存儲區可以保存多個數字證書。更詳細的介紹,可以參考證書。具體的訪問證書存儲區的代碼如下:

         1: private X509Certificate2 GetCertificate(string CertName)
         2: {
         3:     //聲明X509Store對象,指定存儲區的名稱和存儲區的類型
         4:     //StoreName中定義了系統默認的一些存儲區的邏輯名稱
         5:     X509Store store = new X509Store(StoreName.My, StoreLocation.CurrentUser);
         6:     //以只讀的方式打開這個存儲區,OpenFlags定義的打開的方式
         7:     store.Open(OpenFlags.ReadOnly);
         8:     //獲取這個存儲區中的數字證書的集合
         9:     X509Certificate2Collection certCol = store.Certificates;
        10:     //查找滿足證書名稱的證書并返回
        11:     foreach (X509Certificate2 cert in certCol)
        12:     {
        13:         if (cert.SubjectName.Name == "CN="  + CertName)
        14:         {
        15:             store.Close();
        16:             return cert;
        17:         }
        18:     }
        19:     store.Close();
        20:     return null;
        21: }

      我們也可以通過X509Certificate2Collection 對象在當前存儲區中添加刪除證書,詳細的信息可以參考證書存儲區

      上面的介紹是我自己對密鑰保存的一些理解,大家可以根據的具體情況,去選擇具體的方法,希望對大家有所幫助。如果哪位大神有更好的方法,希望留下你的方法共我們學習。

       

       

       

       

      posted @ 2010-08-02 17:48  代碼的旋律  閱讀(12488)  評論(8)    收藏  舉報
      主站蜘蛛池模板: 国精产品999国精产| 古田县| 性欧美VIDEOFREE高清大喷水| 免费吃奶摸下激烈视频| 性色a码一区二区三区天美传媒 | 东京热人妻丝袜无码AV一二三区观| 亚洲V天堂V手机在线| 高清国产一区二区无遮挡| 无码乱人伦一区二区亚洲一| 国产日韩精品视频无码| 欧美人与动交视频在线观看| 精品久久综合日本久久网| 少妇熟女久久综合网色欲| 久久精品人人做人人爽97| 依依成人精品视频在线观看| 东方四虎av在线观看| 国产一区视频一区欧美| 亚洲综合国产精品第一页| 一本大道无码av天堂| 99国产精品久久久久久久日本竹| 五月天丁香婷婷亚洲欧洲国产| 亚洲AV无码久久精品日韩| 亚洲av永久无码精品网站| 红杏av在线dvd综合| 亚洲精品中文字幕无码蜜桃| 国产无码高清视频不卡| 四虎库影成人在线播放| 精品超清无码视频在线观看| 国产av亚洲精品ai换脸电影| 精品国产免费一区二区三区香蕉| 欧美牲交a欧美牲交aⅴ图片| 午夜福利片一区二区三区| 手机在线国产精品| 色欲综合久久中文字幕网| 国产成人精品久久性色av| 国产剧情91精品蜜臀一区| 成人无套少萝内射中出| 亚洲高清国产拍精品网络战| 欧美日韩中文字幕视频不卡一二区 | 99久久国产精品无码| 精品人妻系列无码天堂|