我有以下代码来加密一个值(如下所列)。现在我想写一个 bool isEncrypted() 方法。是否有一种万无一失且可靠的方法来检查值是否已使用此功能加密。我有解密例程并且可以控制密码短语,但不确定这是否有帮助。
原因是 - 当应用首次运行时,配置文件中的值未加密,在这种情况下,应用应自动加密这些值。在第二次运行时,我不想再次加密,因为这显然会造成破坏。最后,我不想将 isEncrypted 属性添加到配置值。我希望它能够工作并且看起来尽可能动态。
到目前为止,我倾向于使用 len (128) 作为决定因素,但未加密的值也有可能是这个长度。
提前致谢。
public static string encrypt(string text)
{
// Locals
var passphrase = "5ab394ed-3920-4932-8d70-9c1b08f4ba4e";
byte[] results;
var utf8 = new UTF8Encoding();
// Step 1. We hash the passphrase using MD5
// We use the MD5 hash generator as the result is a 128 bit byte array
// which is a valid length for the TripleDES encoder we use below
var hashProvider = new MD5CryptoServiceProvider();
var tdesKey = hashProvider.ComputeHash(utf8.GetBytes(passphrase));
// Step 2. Create a new TripleDESCryptoServiceProvider object
// Step 3. Setup the encoder
var tdesAlgorithm = new TripleDESCryptoServiceProvider
{
Key = tdesKey,
Mode = CipherMode.ECB,
Padding = PaddingMode.PKCS7
};
// Step 4. Convert the input string to a byte[]
var dataToEncrypt = utf8.GetBytes(text);
// Step 5. Attempt to encrypt the string
try
{
var encryptor = tdesAlgorithm.CreateEncryptor();
results = encryptor.TransformFinalBlock(dataToEncrypt, 0, dataToEncrypt.Length);
}
finally
{
// Clear the TripleDes and Hashprovider services of any sensitive information
tdesAlgorithm.Clear();
hashProvider.Clear();
}
// Step 6. Return the encrypted string as a base64 encoded string
return Convert.ToBase64String(results);
}
最佳答案
您可以在 isEncrypted 方法中执行的操作是尝试解密消息。
由于您使用的是 PKCS7 填充,因此未加密的消息很可能无法解密,因为填充不符合设置的填充模式。
解密会抛出一个异常,在这种情况下你必须捕获它并返回 false。
如果数据符合填充模式,解密将通过(当消息未加密时)的可能性很小。然而,这是最不可能的。
在这种情况下,我会做的是在加密数据中添加某种标志或将一些数据附加到加密消息中,因为我可以在解密时将其删除。这将是最简单的方法。
关于C#,如何检查值是否使用 MD5 密码加密?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1802801/