c#tripleDESCrypto从sql保存和检索不起作用
嘿那里,所以在msSQL数据库中,我正在使用存储过程保存和检索。我正在尝试在放置之前加密c#windows窗体中的某些数据,然后当我将其拉回时当然会对其进行解密。所有加密都在c#侧处理。我正在使用示例代码从microsoft的tripleDESCryptoService类(内存版本,第二个示例)逐字加密和解密。值被加密并发送到数据库,但是在检索它时会出现“错误数据”错误。
加密呼叫的样本是......
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 个回复
锹缄
并要求它输入一个键/ IV时,它将生成一个新的。您需要将其安全地存储在某处,因为它需要解密数据。否则你没有任何“秘密”所以它不是真正的加密...... 这是一个可怕的想法:
你有
中的任意二进制数据。不要认为它是有效的ASCII文本。这几乎肯定是你丢失数据的地方。 使用
和
将不透明的二进制数据安全地编码为文本。 此外,这是一个坏主意:
如果你要忽略它,创建一个字节数组有什么意义呢?使用
代替。哦,并尝试遵循.NET命名约定:) 说完这一切之后,如果你的加密总是返回一个16个零的字节数组,那么这就是你的
方法被打破的一个非常明确的信号。在您发布该方法的代码之前,我们无法真正帮助您。 最后,如果您的列类型为
,您应该知道,这可能不会保存您需要的所有数据...特别是如果您要包含盐。 Base64会稍微增加数据的大小,加密也可能会这样做。正如另一个答案中所提到的,将其作为二进制文件存储在数据库中会在许多方面更加明智。 (注意:即使你确实想要使用那个代码,我也会把它写成
。使用指令是你的朋友,
是
的属性,而不是
。)
棠媳鳖
将您的byte []转换为String。
厢界山攀