我有以下代码来加密一个值(在下面列出)。现在,我想编写一个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);
}
Run Code Online (Sandbox Code Playgroud)
您可以在 isEncrypted 方法中执行的操作是尝试解密消息。
由于您使用 PKCS7 填充,因此未加密的消息很可能无法解密,因为填充不符合设置的填充模式。
解密将引发异常,在这种情况下您必须捕获该异常并返回 false。
如果数据符合填充模式,则解密成功的可能性很小(当消息未加密时)。然而,这是最不可能的。
在这种情况下,我要做的是在加密数据中添加某种标志或将一些数据附加到加密消息中,因为我可以在解密中将其删除。这将是最万无一失的方法。
| 归档时间: |
|
| 查看次数: |
9221 次 |
| 最近记录: |