我有以下代码:
public static string PerformEncryption(string text, string uniqueKey, bool encrypt = false)
{
byte[] textBytes = encrypt ? Encoding.UTF8.GetBytes(text) : Convert.FromBase64String(text);
byte[] resultArray;
var staticKey = Convert.FromBase64String(ConfigReader.SecretKey);
using (TripleDESCryptoServiceProvider tDes = new TripleDESCryptoServiceProvider())
{
tDes.Mode = CipherMode.ECB;
tDes.Padding = PaddingMode.PKCS7;
tDes.Key = GenerateTripleDesKey(uniqueKey, staticKey);
CTransform = encrypt ? tDes.CreateEncryptor() : tDes.CreateDecryptor();
resultArray = CTransform.TransformFinalBlock(textBytes, 0, textBytes.Length);
tDes.Clear();
}
if (encrypt)
return Convert.ToBase64String(resultArray, 0, resultArray.Length);
return Encoding.UTF8.GetString(resultArray);
}
private static byte[] GenerateTripleDesKey(string uniqueKey, byte[] staticKey)
{
byte[] keyArray;
using (SHA512CryptoServiceProvider hash = new SHA512CryptoServiceProvider())
keyArray = hash.ComputeHash(Encoding.UTF8.GetBytes(string.Format("{0}{1}", uniqueKey, staticKey)));
byte[] trimmedBytes = new byte[24];
Buffer.BlockCopy(keyArray, 0, trimmedBytes, 0, 24);
return trimmedBytes;
}
PerformEncryption
用作辅助方法来执行字符串的加密/解密。还为这两种操作提供了密钥。
它用于Android和Android中的移动应用所使用的Web API应用程序。 iOS设备。
Android上的大部分用户都发生了错误数据错误,iOS上出现此错误的情况要小得多。我在类似移动设备上进行的任何测试都不会产生问题。
我只能重现错误的方法是在加密后修改单元测试中的字符串值。
Web API使用Async / Await,所以我不确定这是否与它有关?
上面的代码中我遗漏了什么,我遗漏了或者是不好的做法?
我无权访问发送到服务器的原始请求,因此我无法确定加密值是否在请求中附加了来自Android / iOS的狡猾字符的内容?
我的其他想法是:
如果这会导致iOS和Android环境出现问题,我应该从使用UTF8 getbytes()
切换到ASCII等效帮助程序类
我是否应该完全像AES一样使用diff算法。
答案 0 :(得分:0)
3DES不应该用于新代码,而是使用AES。
不要使用ECB模式,这是不安全的,请参阅ECB mode,向下滚动到企鹅。而是使用带有随机IV的CBC模式,只需将加密数据加上IV用于解密。
PBKDF2比简单哈希甚至盐渍哈希更安全。主要区别在于迭代以便花费更多时间来计算密钥,PBKDF2常见100,000次迭代。
UTF-8比ASCII更受欢迎。