首页 > Python基础教程 >
-
C#教程之VS开发程序用户防范安全问题
一个开发的系统程序从需求、设计到打包、用户使用的过程中,安全问题一直是开发者关注的焦点。对于用户来说,不考虑加密工具(如加密精灵等),面对的是一个系统的各个组件集合及各类的配置文件( 如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 }
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加解密的密匙的获取,一般是内部人员掌控,可访问服务器获取,安全上更有保障。
那么有了上面加密后的一堆数据,如何更改对应配置文件中的某个配置节上的数据,微软提供System.Configuration.dll组件来操作App.Config配置文件等数据将其处理,如:
1
2
3
|
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文件,难道我们就没有办法了吗?答案当然是否定的。
配置选项:
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> |