我已经将一个旧项目(废话,0文档)从asp.net 1.1转换为4.5,它工作正常。但是现在我们必须更改与我们交互的项目的连接字符串,因此它指向我们的新sql数据库。我们需要加密新的sqlconnection字符串,但有关于此的0文档以及它们如何加密字符串
我设法让解密者工作:
public static string DecryptConnectionString(string value)
{
string cryptoKey = "xxxxxxxx";
Byte[] IV = { xxx, x, xx, xx, x, xx,xxx,xx};
Byte[] byt;
byt = Convert.FromBase64String(value);
TripleDESCryptoServiceProvider des = new TripleDESCryptoServiceProvider();
MD5CryptoServiceProvider md5 = new MD5CryptoServiceProvider();
des.Key = md5.ComputeHash(ASCIIEncoding.ASCII.GetBytes(cryptoKey));
des.IV = IV;
return Encoding.ASCII.GetString(des.CreateDecryptor().TransformFinalBlock(byt, 0, byt.Length));
}
但是我的加密器没有工作它给我一个伪造的随机字符串(如俱乐部),当我插回到解密器时它崩溃
到目前为止,这是我的加密工作:
public static string EncryptConnectionString(string value)
{
char[] v =value.ToCharArray();
string cryptoKey = "xxxxxxxxx";
Byte[] IV = { xxx, x, xx, xx, x, xx,xxx,xx};
Byte[] byt;
byt = Encoding.ASCII.GetBytes(value);
TripleDESCryptoServiceProvider des = new TripleDESCryptoServiceProvider();
MD5CryptoServiceProvider md5 = new MD5CryptoServiceProvider();
des.Key = md5.ComputeHash(ASCIIEncoding.ASCII.GetBytes(cryptoKey));
des.IV = IV;
return Encoding.ASCII.GetString(des.CreateEncryptor().TransformFinalBlock(byt, 0, byt.Length));
}
提前致谢
答案 0 :(得分:5)
这是有问题的:
return Encoding.ASCII.GetString(...);
加密的结果是任意二进制数据。 不尝试将其转换为类似的字符串 - 您几乎总会丢失数据。
相反,要么只是将加密数据作为byte[]
返回,要么使用类似Base64的内容以可逆方式将其转换为文本:
return Convert.ToBase64String(...);
事实上,在您的解密代码中,您似乎已经假设它是Base64:
byt = Convert.FromBase64String(value);
...所以你甚至不需要更改解密代码。
(顺便说一句,我对使用MD5创建这样的密钥非常怀疑 - 但这是另一回事。哦,目前你无法处理任何非ASCII文本(使用UTF-8代替),你没有明显的原因致电ToCharArray
。)
有关此类事情的详细信息,请参阅我的blog post on reversible data transformations,以及如果您将来遇到类似问题,如何逐步分离此过程。
答案 1 :(得分:2)
要使加密器脱离正常工作的解密器(反之亦然),您可以一步一步地反转该过程:
byt = Convert.FromBase64String(value);
TripleDESCryptoServiceProvider des = new TripleDESCryptoServiceProvider();
MD5CryptoServiceProvider md5 = new MD5CryptoServiceProvider();
des.Key = md5.ComputeHash(ASCIIEncoding.ASCII.GetBytes(cryptoKey));
des.IV = IV;
return Encoding.ASCII.GetString(des.CreateDecryptor().TransformFinalBlock(byt, 0, byt.Length));
取出与制作相关的部分,并分离函数调用:
TripleDESCryptoServiceProvider des = new TripleDESCryptoServiceProvider();
MD5CryptoServiceProvider md5 = new MD5CryptoServiceProvider();
des.Key = md5.ComputeHash(ASCIIEncoding.ASCII.GetBytes(cryptoKey));
des.IV = IV;
byt = Convert.FromBase64String(value);
byte[] decrypted = des.CreateDecryptor().TransformFinalBlock(byt, 0, byt.Length)
return Encoding.ASCII.GetString(decrypted);
然后按顺序颠倒操作:
// here lies the key-making code
return Encoding.ASCII.GetString(decrypted);
byte[] decrypted = des.CreateDecryptor().TransformFinalBlock(byt, 0, byt.Length)
byt = Convert.FromBase64String(value);
最后在实际操作中反转每一个(输入变为输出,解密变为加密等):
// here lies the key-making code
byt = Encoding.ASCII.GetBytes(value);
byte[] encrypted = des.CreateEncryptor().TransformFinalBlock(byt, 0, byt.Length)
return Convert.ToBase64String(encrypted);