一個開發的系統程式從需求、設計到打包、用戶使用的過程中,安全問題一直是開發者關註的焦點。對於用戶來說,不考慮加密工具(如加密精靈等),面對的是一個系統的各個組件集合及各類的配置文件( 如App.Config / Web.Config)。其中,涉及到安全防範問題如App.Config配置文件,裡面會包 ...
一個開發的系統程式從需求、設計到打包、用戶使用的過程中,安全問題一直是開發者關註的焦點。對於用戶來說,不考慮加密工具(如加密精靈等),面對的是一個系統的各個組件集合及各類的配置文件( 如App.Config / Web.Config)。其中,涉及到安全防範問題如App.Config配置文件,裡面會包含很多信息,包括最不想讓用戶知道的伺服器地址、登錄名和密碼等,特殊的文件除外。本篇文章會展開兩種方式來處理安全問題。
(1)如果只是簡單的防使用人員的話,那麼你可以考慮在appsetting或其他的配置節中放加密後的連接字元串,然後在使用的地方先解密再使用,這裡我介紹下DES加解密的方式(密匙為8位位元組)。
1 /// <summary> 2 /// DES加密,密鑰為8位字元 3 /// </summary> 4 /// <param name="strEncrypt">需要加密的字元串</param> 5 /// <param name="strKey">8位的密鑰</param> 6 /// <returns></returns> 7 public static string DesEncrypt(string strEncrypt, string strKey) 8 { 9 if (string.IsNullOrEmpty(strEncrypt)) return null; 10 try 11 { 12 DESCryptoServiceProvider des = new DESCryptoServiceProvider(); 13 byte[] inputByteArray = Encoding.Default.GetBytes(strEncrypt); 14 des.Key = ASCIIEncoding.ASCII.GetBytes(strKey); 15 des.IV = ASCIIEncoding.ASCII.GetBytes(strKey); 16 MemoryStream ms = new MemoryStream(); 17 CryptoStream cs = new CryptoStream(ms, des.CreateEncryptor(), CryptoStreamMode.Write); 18 cs.Write(inputByteArray, 0, inputByteArray.Length); 19 cs.FlushFinalBlock(); 20 StringBuilder ret = new StringBuilder(); 21 foreach (byte b in ms.ToArray()) 22 { 23 ret.AppendFormat("{0:X2}", b); 24 } 25 ret.ToString(); 26 return ret.ToString(); 27 } 28 catch 29 { 30 return null; 31 } 32 }DES加密,密鑰為8位字元
1 /// <summary> 2 /// DES解密,密鑰為8為字元 3 /// </summary> 4 /// <param name="strDecrypt">需要加密的字元串</param> 5 /// <param name="strKey">8位的密鑰</param> 6 /// <returns></returns> 7 public string DesDecrypt(string strDecrypt, string strKey) 8 { 9 if (string.IsNullOrEmpty(strDecrypt)) return null; 10 try 11 { 12 DESCryptoServiceProvider des = new DESCryptoServiceProvider(); 13 byte[] inputByteArray = new byte[strDecrypt.Length / 2]; 14 for (int x = 0; x < strDecrypt.Length / 2; x++) 15 { 16 int i = (Convert.ToInt32(strDecrypt.Substring(x * 2, 2), 16)); 17 inputByteArray[x] = (byte)i; 18 } 19 des.Key = ASCIIEncoding.ASCII.GetBytes(strKey); 20 des.IV = ASCIIEncoding.ASCII.GetBytes(strKey); 21 MemoryStream ms = new MemoryStream(); 22 CryptoStream cs = new CryptoStream(ms, des.CreateDecryptor(), CryptoStreamMode.Write); 23 cs.Write(inputByteArray, 0, inputByteArray.Length); 24 cs.FlushFinalBlock(); 25 return System.Text.Encoding.Default.GetString(ms.ToArray()); 26 } 27 catch 28 { 29 return null; 30 } 31 }DES解密,密鑰為8為字元
關於DES加解密的密匙的獲取,一般是內部人員掌控,可訪問伺服器獲取,安全上更有保障。
那麼有了上面加密後的一堆數據,如何更改對應配置文件中的某個配置節上的數據,微軟提供System.Configuration.dll組件來操作App.Config配置文件等數據將其處理,如:
Configuration config = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None); config.AppSettings.Settings["配置節"].Value = strDesEncrypt;//DES加密後的數據 config.Save();
缺點:安全性低,局限於非電腦操作者,對於一個業務繁瑣的系統不切實際。
提供參考網站:https://wenda.so.com/q/1370928295068825
(2) 預設情況下,我們需要對App.config文件里的connectionStrings或其他配置節片斷進行加密處理,ASP.NET IIS 註冊工具 (Aspnet_regiis.exe)可以勝任這個工作,但這個工具只能針對ASP.NET的Web.config文件,難道我們就沒有辦法了嗎?答案當然是否定的。
配置選項:
-pdf section webApplicationDirectory 對指定物理(非虛擬)目錄中的 Web.config 文件的指定配置節進行解密。 -pef section webApplicationDirectory 對指定物理(非虛擬)目錄中的 Web.config 文件的指定配置節進行加密。 -pdf 和-pef 參數是對指定的物理目錄里的Web.config文件進行加密,我們可以先將App.config文件改名為Web.config,通過這兩個參數便可以“騙”過系統,讓它將指定的配置節 進行加密,我們只需要將加密後的文件名改回App.config即可,我們來實驗一下: 第一步:先將目錄下的App.config改名為Web.config。 第二步:打開SDK命令提示,輸入命令:aspnet_regiis -pef "配置節" "目錄",以我的項目為例,加密前的config文件內容如下:1<?xml version="1.0" encoding="utf-8"?> 2<configuration> 3 <configSections> 4 <section name="dataConfiguration" type="Microsoft.Practices.EnterpriseLibrary.Data.Configuration.DatabaseSettings, Microsoft.Practices.EnterpriseLibrary.Data, Version=2.0.0.0, Culture=neutral, PublicKeyToken=null" /> 5 </configSections> 6 <dataConfiguration defaultDatabase="Connection String" /> 7 <connectionStrings> 8 <add name="Connection String" connectionString="Database=LocomotiveStat;Server=10.167.61.49;User ID=sa;Password=sa;" 9 providerName="System.Data.SqlClient" /> 10 </connectionStrings> 11</configuration>
輸入命令:aspnet_regiis -pef "你要加密的【配置節】" "你要加密的【目錄】",加密後的config文件內容如下:
1<?xml version="1.0" encoding="utf-8"?> 2<configuration> 3 <configSections> 4 <section name="dataConfiguration" type="Microsoft.Practices.EnterpriseLibrary.Data.Configuration.DatabaseSettings, Microsoft.Practices.EnterpriseLibrary.Data, Version=2.0.0.0, Culture=neutral, PublicKeyToken=null" /> 5 </configSections> 6 <dataConfiguration defaultDatabase="Connection String" /> 7 <connectionStrings configProtectionProvider="RsaProtectedConfigurationProvider"> 8 <EncryptedData Type="http://www.w3.org/2001/04/xmlenc#Element" 9 xmlns="http://www.w3.org/2001/04/xmlenc#"> 10 <EncryptionMethod Algorithm="http://www.w3.org/2001/04/xmlenc#tripledes-cbc" /> 11 <KeyInfo xmlns="http://www.w3.org/2000/09/xmldsig#"> 12 <EncryptedKey xmlns="http://www.w3.org/2001/04/xmlenc#"> 13 <EncryptionMethod Algorithm="http://www.w3.org/2001/04/xmlenc#rsa-1_5" /> 14 <KeyInfo xmlns="http://www.w3.org/2000/09/xmldsig#"> 15 <KeyName>Rsa Key</KeyName> 16 </KeyInfo> 17 <CipherData> 18 <CipherValue>g2QFQqbHU1L6WUPYqjADqFAvHcdq/7dqCd1U9GlQFEi/nHDVHjqsWvjNywOZtQQg7Q/yW7g8xlRCo0h2+yYd/tQTNoVMu/RKdJmSjZMnmnwpWq+S2VEWK4U106JQwLCfBR/bAF4DHvG47B9KB0JbRfXBt5V2wJVaAI9u3kzuj50=</CipherValue> 19 </CipherData> 20 </EncryptedKey> 21 </KeyInfo> 22 <CipherData> 23 <CipherValue>blwV/ZW1izFZL80YL5RkcjrIjWkQ0L1gJhgZbxEzzTgOcT24ihrAnv3/rDCG+WIZ7TL5D/rMm7dQwkIsij1Sh3befg6F3+pxcW4oe1w/bovIKuzjs3tokUpBvTTj+fsCs2W/MWUhQaWMKQWkHfS2Ajt6gL6MTYtb3pfQUp0pdHbeRxoqdiAksQ1Zzsi1FtRTi7gTT7hnpF0pJs+W9mxTVDMO/qSZXfXLOEMIs/A5ExcfvR5GjpaPuDeLuSsCN3XtjaiXzaDQ3It7j+r66+L2C0xvEhbT9SsG</CipherValue> 24 </CipherData> 25 </EncryptedData> 26 </connectionStrings> 27</configuration>
自己也隨便找了個配置文件式下了,成功了。
由此可見,我們已經完成了任務,現在只需要將App.config文件名改回Web.config即可,在應用程式項目中無需對該文件進行解密操作,.NET框架會自動替我們完成,如果想解密該文件也很簡單,在SDK命令提示里輸入aspnet_regiis -pdf "配置節" "目錄"即可。
參考網址如:https://blog.csdn.net/dqs78833488/article/details/51115537
希望本篇文章對大家有一定的幫助,以上有不足之處,或有其他更合理的方法請留言賜教。
A young ilder ~ An old baggar !