解密时偶尔坏数据错误
问题描述:
我有一个很奇怪的情况。 基本上我有使用由创建的解密的代码:解密时偶尔坏数据错误
Dim des3 As New TripleDESCryptoServiceProvider
des3.Mode = CipherMode.CBC
Return des3.CreateDecryptor(_encKey, _initVec)
的_encKey和_initVec是硬编码的。 我用它通过调用:
Dim res() As Byte = decrypt(Convert.FromBase64String(_data))
m_transformDec.TransformFinalBlock(res, 0, res.Length)
这里_data是包含加密值的字符串。 m_transformDec是之前创建的Decryptor。
通常这个工作。偶尔,我得到一个“不良数据”错误。我打印出_data的值,并且它始终是相同的。
该代码是多线程的,我怀疑这是两个问题的原因,它很难重现。解密程序是在类的创建过程中创建的,并且解密是在Shared函数中完成的,但是我没有看到任何不是线程安全的。
任何想法?
答
- 你不应该承担任何是并发呼叫安全的,除非你有理由相信它。在文档中,您有模板文本,实例成员不能保证线程安全,因此在使用时应该防御性地锁定
des3
对象。 - 你不应该对初始化向量进行硬编码;它应该在加密数据时被随机选择,然后以加密的数据以某种方式存储(许多人选择将其加到数据的开头,然后将其删除并用于解密;不过,使用任何您喜欢的存储方案) 。使用相同的IV会破坏IV的目的,这使得明文攻击更加困难。