我做了一个winform的程序,连接数据库通过读取app.config
我怎么在配置文件之前加密数据库连接字符串,加密后的字符串怎么再进行修改,需要做一个小程序专门修改数据库连接么?
不想让别人看到配置文件中的明文口令,那样太弱智了.
高手给点实质性建议或者代码,加密后可以方便的修改连接,很自然的能够顺利解密配置文件就可以..
拜谢了!! 

解决方案 »

  1.   

    //简单的des加解密类,针对字符串,明文长度增加时,密文长度成倍增长,适合于短字符串加解密
        public class DESEncrypt
        {//注意: 经过测试,yourkey只有前6个字符起作用
            /// <summary>
            /// 构造方法
            /// </summary>
            public DESEncrypt()
            {
            }
            /// <summary>
            /// 使用缺省密钥字符串加密,返回密文
            /// </summary>
            /// <param name="original">明文</param>
            /// <returns>密文</returns>
            public string Encrypt(string original)
            {
                return Encrypt(original, "yourkey");
            }
            /// <summary>
            /// 使用缺省密钥解密,返回明文
            /// </summary>
            /// <param name="original">密文</param>
            /// <returns>明文</returns>
            public  string Decrypt(string original)
            {
                return Decrypt(original, "yourkey", System.Text.Encoding.Default);
            }
            /// <summary>
            /// 使用给定密钥解密
            /// </summary>
            /// <param name="original">密文</param>
            /// <param name="key">密钥</param>
            /// <returns>明文</returns>
            private  static string Decrypt(string original, string key)
            {
                return Decrypt(original, key, System.Text.Encoding.Default);
            }
            /// <summary>
            /// 使用缺省密钥解密,返回指定编码方式明文
            /// </summary>
            /// <param name="original">密文</param>
            /// <param name="encoding">编码方式</param>
            /// <returns>明文</returns>
            private static string Decrypt(string original, Encoding encoding)
            {
                return Decrypt(original, "yourkey", encoding);
            }
            /// <summary>
            /// 使用给定密钥加密
            /// </summary>
            /// <param name="original">原始文字</param>
            /// <param name="key">密钥</param>
            /// <param name="encoding">字符编码方案</param>
            /// <returns>密文</returns>
            private static string Encrypt(string original, string key)
            {
                try
                {
                    byte[] buff = System.Text.Encoding.Default.GetBytes(original);
                    byte[] kb = System.Text.Encoding.Default.GetBytes(key);
                    return Convert.ToBase64String(Encrypt(buff, kb));
                }
                catch
                {
                    return original;
                }
            }        /// <summary>
            /// 使用给定密钥解密
            /// </summary>
            /// <param name="encrypted">密文</param>
            /// <param name="key">密钥</param>
            /// <param name="encoding">字符编码方案</param>
            /// <returns>明文</returns>
            private static string Decrypt(string encrypted, string key, Encoding encoding)
            {
                try
                {
                    byte[] buff = Convert.FromBase64String (encrypted);
                    byte[] kb = System.Text.Encoding.Default.GetBytes(key);
                    return encoding.GetString(Decrypt(buff, kb));
                }
                catch
                {
                    return encrypted;
                }
             
            }
            /// <summary>
            /// 生成MD摘要
            /// </summary>
            /// <param name="original">数据源</param>
            /// <returns>摘要</returns>
            private static byte[] MakeMD(byte[] original)
            {
                MD5CryptoServiceProvider hashmd = new MD5CryptoServiceProvider();
                byte[] keyhash = hashmd.ComputeHash(original);
                hashmd = null;
                return keyhash;
            }        /// <summary>
            /// 使用给定密钥加密
            /// </summary>
            /// <param name="original">明文</param>
            /// <param name="key">密钥</param>
            /// <returns>密文</returns>
            private static byte[] Encrypt(byte[] original, byte[] key)
            {
                TripleDESCryptoServiceProvider des = new TripleDESCryptoServiceProvider();
                des.Key = MakeMD(key);
                des.Mode = CipherMode.ECB;            return des.CreateEncryptor().TransformFinalBlock(original, 0, original.Length);
            }        /// <summary>
            /// 使用给定密钥解密数据
            /// </summary>
            /// <param name="encrypted">密文</param>
            /// <param name="key">密钥</param>
            /// <returns>明文</returns>
            private static byte[] Decrypt(byte[] encrypted, byte[] key)
            {
                TripleDESCryptoServiceProvider des = new TripleDESCryptoServiceProvider();
                des.Key = MakeMD(key);
                des.Mode = CipherMode.ECB;            return des.CreateDecryptor().TransformFinalBlock(encrypted, 0, encrypted.Length);
            }        /// <summary>
            /// 使用给定密钥加密
            /// </summary>
            /// <param name="original">原始数据</param>
            /// <param name="key">密钥</param>
            /// <returns>密文</returns>
            private static byte[] Encrypt(byte[] original)
            {
                byte[] key = System.Text.Encoding.Default.GetBytes("yourkey");
                return Encrypt(original, key);
            }        /// <summary>
            /// 使用缺省密钥解密数据
            /// </summary>
            /// <param name="encrypted">密文</param>
            /// <param name="key">密钥</param>
            /// <returns>明文</returns>
            private static byte[] Decrypt(byte[] encrypted)
            {
                byte[] key = System.Text.Encoding.Default.GetBytes("yourkey");
                return Decrypt(encrypted, key);
            }
        }
      

  2.   

    就是如果我加密xml后 打开xml变成加密后的显示了 我如果想修改其中的内容 是不是也需要单独做一个程序来实现呢  不然是没有办法修改的吧 
      

  3.   

    再问一下  我加密这个xml 在什么时候加密  搞晕了 我想在读取这个xml文件的时候进行加密 然后保存加密后的xml文件  再进行解密  返回解密后的字符串 不知道这样是否可行  
      

  4.   

    晕 就是加密app.config文件中的字符串啊
      

  5.   

    问题算是解决 只是修改感觉N麻烦啊  需要另外提供一个小窗口  解密app.config字符串后需要获得app.config的节点 然后分别修改  数据库连接字符串 还要sumstring   哎 修改真是头疼 
      

  6.   

    数据库连接字符串你加密后存储,用的时候解密就行了.你最后把.exe文件给人家,谁会知道你的加解密是通过怎样的方法实现的。。?
      

  7.   

    配置文件需要客户在前台手工设置?
    步骤:
    1.初次使用时生成连接串:前台提示输入server/user/pass,[保存],手工生成连接串,加密算法->密文,保存.
    2.使用数据库:读取密文,解密->明文,程序使用明文进行数据库操作.
    3.修改连接串:同步骤1.
    4.查看连接串:读取密文,解密->显示.
    5.手工修改配置文件:直接做个winform窗口吧.
      

  8.   

    建议不要将数据库等重要信息放入app.config 要放在server端 使用Webservice就能避免这种情况