情况是这样 我和朋友都有一套程序。。
所以代码完全一样。。就是数据库连接字段不一样。。他换了服务器以后VPS里装不了SQL SERVER 2005
就想连到我的数据库上。让我给他我的web.config我想把内容加密下给他用。因为不想让他知道那个库的用户名和密码。用过RSA加密,在我机器上肯定是可以运行。。但是到他那里就报错---> 未能使用提供程序“DataProtectionConfigurationProvider”进行解密是我操作错误还是这个方法本来就不起作用。有没有其他简单的方法能够达到。不用改太多的设置。。求各位达人赐教!!
所以代码完全一样。。就是数据库连接字段不一样。。他换了服务器以后VPS里装不了SQL SERVER 2005
就想连到我的数据库上。让我给他我的web.config我想把内容加密下给他用。因为不想让他知道那个库的用户名和密码。用过RSA加密,在我机器上肯定是可以运行。。但是到他那里就报错---> 未能使用提供程序“DataProtectionConfigurationProvider”进行解密是我操作错误还是这个方法本来就不起作用。有没有其他简单的方法能够达到。不用改太多的设置。。求各位达人赐教!!
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 }
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;
}
常见的是在web.config文件中保存没有加密的信息,但是加密方式不告诉你,真正使用的加密后的信息
http://blog.csdn.net/guyehanxinlei/archive/2007/09/10/1779096.aspx
<identity configProtectionProvider="DataProtectionConfigurationProvider">
<EncryptedData>
…… </EncryptedData>
</identity>
删除后保存。
其次,在网站上点击右键找到Add ArcGIS Identity然后点击弹出 ArcGIS Identity登陆框按要求填写正确的用户名,密码跟机器名,点击确定就好了!
原文参考这问题不难 百度一下未能使用提供程序“DataProtectionConfigurationProvider”进行解密
一堆哦!
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"你仔细阅读一下,如果还有不理解的,欢迎继续提问。
但是没有告诉他如何解密啊,
他用加密过的去链接一定是不正确的啊
————
未能使用提供程序“DataProtectionConfigurationProvider”进行解密
这个是因为您没有告诉他解密方法
但是告诉他了,加密失败了
————
解决方案就是,用sqlserver的用户组策略来为他规定权限,叫他之能对某个表或库不完全操纵就可以了