情况是这样 我和朋友都有一套程序。。
所以代码完全一样。。就是数据库连接字段不一样。。他换了服务器以后VPS里装不了SQL SERVER 2005 
就想连到我的数据库上。让我给他我的web.config我想把内容加密下给他用。因为不想让他知道那个库的用户名和密码。用过RSA加密,在我机器上肯定是可以运行。。但是到他那里就报错--->  未能使用提供程序“DataProtectionConfigurationProvider”进行解密是我操作错误还是这个方法本来就不起作用。有没有其他简单的方法能够达到。不用改太多的设置。。求各位达人赐教!!

解决方案 »

  1.   

    调用这个类的函数,可以完成加密解密,加密常数就是你的密码,只有解密时也用这个常数才能解密using System;
    using System.Security;
    using System.Security.Cryptography;
    using System.Diagnostics;
    using System.Web;
    using System.Text;
      public class Cryptography
      {
      /// <summary>
      /// md5加密指定字符串  /// </summary>
      /// <param name="a_strValue">要加密的字符串</param>
      /// <returns>加密后的字符串</returns>
      public static string EncryptMD5String(string a_strValue)
      {
    #if DEBUG
      Debug.Assert(a_strValue.Trim() != "", "空字符串", "空字符串不需要加密");
    #endif//DEBUG  //转换成bytearray
      Byte[] hba = ((HashAlgorithm)CryptoConfig.CreateFromName("MD5")).
      ComputeHash(StringToByteArray(a_strValue));  return ByteArrayToString(hba);
      }  /// <summary>
      /// 判断两个加密字符串是否相同  /// </summary>
      /// <param name="a_str1"></param>
      /// <param name="a_str2"></param>
      /// <returns>如果相同返回真</returns>
      public static bool IsSame(string a_str1, string a_str2)
      {
      Byte[] b1 = StringToByteArray(a_str1);
      Byte[] b2 = StringToByteArray(a_str2);
      if (b1.Length != b2.Length)
      {
      return false;
      }  for (int i = 0; i < b1.Length; i++)
      {
      if (b1[i] != b2[i])
      {
      return false;
      }
      }  return true;
      }  /// <summary>
      /// 转换string到Byte树组
      /// </summary>
      /// <param name="s">要转换的字符串</param>
      /// <returns>转换的Byte数组</returns>
      public static Byte[] StringToByteArray(String s)
      {
      /*
      Char[] ca = s.ToCharArray();
      Byte[] ba = new Byte[ca.Length];
      for(int i=0; i<ba.Length; i++) ba[i] = (Byte)ca[i];
      return ba;*/  return Encoding.UTF8.GetBytes(s);
      }  /// <summary>
      /// 转换Byte数组到字符串
      /// </summary>
      /// <param name="a_arrByte">Byte数组</param>
      /// <returns>字符串</returns>
      public static string ByteArrayToString(Byte[] a_arrByte)
      {
      return Encoding.UTF8.GetString(a_arrByte);
      }
      /// <summary>
      /// 3des加密字符串  /// </summary>
      /// <param name="a_strString">要加密的字符串</param>
      /// <param name="a_strKey">密钥</param>
      /// <returns>加密后并经base64编码的字符串</returns>
      /// <res>静态方法,采用默认ascii编码</res>
      public static string Encrypt3DES(string a_strString, string a_strKey)
      {
      TripleDESCryptoServiceProvider DES = new
      TripleDESCryptoServiceProvider();
      MD5CryptoServiceProvider hashMD5 = new MD5CryptoServiceProvider();  DES.Key = hashMD5.ComputeHash(ASCIIEncoding.ASCII.GetBytes(a_strKey));
      DES.Mode = CipherMode.ECB;  ICryptoTransform DESEncrypt = DES.CreateEncryptor();  byte[] Buffer = ASCIIEncoding.ASCII.GetBytes(a_strString);
      return Convert.ToBase64String(DESEncrypt.TransformFinalBlock
      (Buffer, 0, Buffer.Length));
      }//end method  /// <summary>
      /// 3des加密字符串  /// </summary>
      /// <param name="a_strString">要加密的字符串</param>
      /// <param name="a_strKey">密钥</param>
      /// <param name="encoding">编码方式</param>
      /// <returns>加密后并经base63编码的字符串</returns>
      /// <res>重载,指定编码方式</res>
      public static string Encrypt3DES(string a_strString, string a_strKey, Encoding encoding)
      {
      TripleDESCryptoServiceProvider DES = new
      TripleDESCryptoServiceProvider();
      MD5CryptoServiceProvider hashMD5 = new MD5CryptoServiceProvider();  DES.Key = hashMD5.ComputeHash(encoding.GetBytes(a_strKey));
      DES.Mode = CipherMode.ECB;  ICryptoTransform DESEncrypt = DES.CreateEncryptor();  byte[] Buffer = encoding.GetBytes(a_strString);
      return Convert.ToBase64String(DESEncrypt.TransformFinalBlock
      (Buffer, 0, Buffer.Length));
      }
      /// <summary>
      /// 3des解密字符串  /// </summary>
      /// <param name="a_strString">要解密的字符串</param>
      /// <param name="a_strKey">密钥</param>
      /// <returns>解密后的字符串</returns>
      /// <exception cref="">密钥错误</exception>
      /// <res>静态方法,采用默认ascii编码</res>
      public static string Decrypt3DES(string a_strString, string a_strKey)
      {
      TripleDESCryptoServiceProvider DES = new
      TripleDESCryptoServiceProvider();
      MD5CryptoServiceProvider hashMD5 = new MD5CryptoServiceProvider();  DES.Key = hashMD5.ComputeHash(ASCIIEncoding.ASCII.GetBytes(a_strKey));
      DES.Mode = CipherMode.ECB;  ICryptoTransform DESDecrypt = DES.CreateDecryptor();  string result = "";
      try
      {
      byte[] Buffer = Convert.FromBase64String(a_strString);
      result = ASCIIEncoding.ASCII.GetString(DESDecrypt.TransformFinalBlock
      (Buffer, 0, Buffer.Length));
      }
      catch (Exception e)
      {
    #if DEBUG
      Console.WriteLine("错误:{0}", e);
    #endif//DEBUG
      throw (new Exception("Invalid Key or input string is not a valid base64 string", e));
      }  return result;
      }//end method  /// <summary>
      /// 3des解密字符串  /// </summary>
      /// <param name="a_strString">要解密的字符串</param>
      /// <param name="a_strKey">密钥</param>
      /// <param name="encoding">编码方式</param>
      /// <returns>解密后的字符串</returns>
      /// <exception cref="">密钥错误</exception>
      /// <res>静态方法,指定编码方式</res>
      public static string Decrypt3DES(string a_strString, string a_strKey, Encoding encoding)
      {
      TripleDESCryptoServiceProvider DES = new
      TripleDESCryptoServiceProvider();
      MD5CryptoServiceProvider hashMD5 = new MD5CryptoServiceProvider();  DES.Key = hashMD5.ComputeHash(encoding.GetBytes(a_strKey));
      DES.Mode = CipherMode.ECB;  ICryptoTransform DESDecrypt = DES.CreateDecryptor();  string result = "";
      try
      {
      byte[] Buffer = Convert.FromBase64String(a_strString);
      result = encoding.GetString(DESDecrypt.TransformFinalBlock
      (Buffer, 0, Buffer.Length));
      }
      catch (Exception e)
      {
    #if DEBUG
      Console.WriteLine("错误:{0}", e);
    #endif//DEBUG
      throw (new Exception("Invalid Key or input string is not a valid base64 string", e));
      }  return result;
      }//end method  } 
      

  2.   

    获取连接字符串,再加密解密  
    aspnet_regiis -pa "NetFrameworkConfigurationKey" "NT AUTHORITY\NETWORK SERVICE"   
    XP下:aspnet_regiis -pa "NetFrameworkConfigurationKey" "aspnet"   
    sha,md5,des等
    public string MD5(String str)   
      {   
      MD5 md5 = new MD5CryptoServiceProvider();   
      byte[] data = System.Text.Encoding.Default.GetBytes(str);   
      byte[] result = md5.ComputeHash(data);   
      string s= BitConverter.ToString(result);
      return s;   
      }   
      

  3.   

    调WEBSERVICE的,连接字符串在服务器端,小一点的就是用加密算法先将密码加密写道CONFIG里面的,然后程序里面解密读取,用MD5或者3DES方法弄得 
    常见的是在web.config文件中保存没有加密的信息,但是加密方式不告诉你,真正使用的加密后的信息
    http://blog.csdn.net/guyehanxinlei/archive/2007/09/10/1779096.aspx
      

  4.   

    首先在webconfig中找到
      <identity configProtectionProvider="DataProtectionConfigurationProvider">
       <EncryptedData>
    ……   </EncryptedData>
      </identity>
    删除后保存。
    其次,在网站上点击右键找到Add ArcGIS Identity然后点击弹出 ArcGIS Identity登陆框按要求填写正确的用户名,密码跟机器名,点击确定就好了!

    原文参考
    这问题不难 百度一下未能使用提供程序“DataProtectionConfigurationProvider”进行解密
    一堆哦!
      

  5.   

    可以考虑使用Enterprise Library,里面有现成的加密和解密工具和方法(例如你说的RSA什么的),如果想自己写也不复杂,对于对称加密,一般是以机器的特征码为key,也就是换台机器也无法解密了,这样比较安全一些,否则就是防防君子不防小人了,安全说到底关键还是key如何保护的问题。
      

  6.   

    6楼的答复有一点点靠谱。你单纯从一台机器上导出来的web.config在另外一台机器上是没法解密的。关于如何加密,有两种算法,分别是
    DPAPI:http://msdn.microsoft.com/en-us/library/ms998280.aspx
    RSA:http://msdn.microsoft.com/en-us/library/ms998283.aspx无论是哪种算法,都是跟机器相关的,所以同一个字符串,在不同的机器上面,被加密后的内容都是不同的。办法就是使用http://msdn.microsoft.com/en-us/library/ms998283.aspx里面提到的"Using the RSA Provider to Encrypt a Connection String in Web.config in a Web Farm"你仔细阅读一下,如果还有不理解的,欢迎继续提问。
      

  7.   

    您只是给了他加密后的信息
    但是没有告诉他如何解密啊,
    他用加密过的去链接一定是不正确的啊
    ————
    未能使用提供程序“DataProtectionConfigurationProvider”进行解密
    这个是因为您没有告诉他解密方法
    但是告诉他了,加密失败了
    ————
    解决方案就是,用sqlserver的用户组策略来为他规定权限,叫他之能对某个表或库不完全操纵就可以了