c#tripleDESCrypto保存并从sql中检索不起作用

时间:2011-01-28 17:03:53

标签: c# sql tripledes

嘿那里,所以在msSQL数据库中,我正在保存并从使用存储过程中检索。我正在尝试在放置之前加密c#windows窗体中的某些数据,然后当我将其拉回时当然会对其进行解密。所有加密都在c#侧处理。我正在使用示例代码从microsoft's tripleDESCryptoService Class(内存版本,第二个示例)逐字加密和解密。值被加密并发送到数据库,但是在检索它时会出现“错误数据”错误。 加密呼叫的样本是......

TripleDESCryptoServiceProvider tDESalg = new TripleDESCryptoServiceProvider();
byte[] tempByte = new byte[100];
tempByte = encrypt(txt_Last_Name.Text, tDESalg.Key, tDESalg.IV);
txt_Last_Name.Text = System.Text.ASCIIEncoding.ASCII.GetString(tempByte);

然后将txt_Last_Name发送到数据库,我可以看到数据库中有一些东西。在数据库中,姓氏为varchar(20)

解密呼叫的样本是......

TripleDESCryptoServiceProvider tDESalg = new TripleDESCryptoServiceProvider();
string lastName = dr.GetString(dr.GetOrdinal("Last Name"));
if (isEncrypted)
{
     byte[] toDecrypt = new ASCIIEncoding().GetBytes(lastName);
     lastName = decrypt(toDecrypt, tDESalg.Key, tDESalg.IV);                    
}
txt_Last_Name.Text = lastName;

它在解密函数中炸弹:“csDecrypt.Read(fromEncrypt,0,fromEncrypt.Length);”我不明白为什么。我不确定它是否未正确存储在数据库中,或者我的转换不正确。

如果它意味着什么,进入解密函数的“数据”大小为16并包含非零值,但是“byte [] fromEncrypt”是一个大小为16的数组,包含全零。

感谢您的帮助!

3 个答案:

答案 0 :(得分:3)

编辑:好的,我们已经到底了......虽然ASCII问题也会被咬过。

每当您创建新的TripleDESCryptoServiceProvider并要求输入密钥/ IV时,它都会生成一个新密钥。您需要将其安全地存储在某处,因为它需要解密数据。否则你没有任何“秘密”,所以它不是真正的加密......


这是一个糟糕的主意:

txt_Last_Name.Text = System.Text.ASCIIEncoding.ASCII.GetString(tempByte);

tempByte中有任意二进制数据。 不要假设它是有效的ASCII文本。这几乎肯定是你丢失数据的地方。

使用Convert.ToBase64StringConvert.FromBase64String将不透明的二进制数据安全地编码为文本。

此外,这是一个坏主意:

byte[] tempByte = new byte[100];
tempByte = encrypt(txt_Last_Name.Text, tDESalg.Key, tDESalg.IV);

如果你要忽略它,创建一个字节数组有什么意义呢?使用

byte[] tempByte = encrypt(txt_Last_Name.Text, tDESalg.Key, tDESalg.IV);

代替。哦,并尝试遵循.NET命名约定:)

说完所有这些后,如果你的加密总是返回一个16个零的字节数组,那么这是一个非常明确的信号,表明你的encrypt方法已被破坏。在您发布该方法的代码之前,我们无法真正帮助您。

最后,如果您的列属于varchar(20)类型,您应该知道,这可能很难保存您需要的所有数据...特别是如果您要包含盐。 Base64会稍微增加数据的大小,加密也可能会这样做。正如另一个答案中所提到的,将其作为二进制存储在数据库中会在许多方面更加明智。

(注意:即使你 想要使用该代码,我也会将其写为txt_Last_Name.Text = Encoding.ASCII.GetString(tempByte);。使用指令是你的朋友,ASCII是属性Encoding,而不是ASCIIEncoding。)

答案 1 :(得分:0)

只需reading the doc ...您应该使用Convert.ToBase64String()将byte []转换为字符串。

答案 2 :(得分:0)

Convert.ToBase64String(),如上面推荐的pascal,或者将数据作为二进制文件存储在数据库中而不是文本中(首选解决方案,因为它会占用更少的空间)。在SQL Server中,出于此目的,存在VARBINARY(MAX)数据类型。