C#,如何检查值是否使用MD5密码加密?

时间:2009-11-26 10:14:59

标签: c# encryption

我有以下代码来加密值(下面列出)。现在我想写一个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);
    }

3 个答案:

答案 0 :(得分:4)

首先,作为一个严重的问题,自己使用加密原语是一个非常糟糕的主意。您已选择使用电子密码本加密模式,该模式具有相同的明文块生成相同的密文块的属性。查看the example at Wikipedia

也就是说,一个简单的解决方案是将诸如'ENC:'之类的令牌添加到加密密码中。如果您需要担心恶意篡改配置文件,您应该继续使用消息验证代码,例如HMAC。

答案 1 :(得分:3)

您在isEncrypted方法中可以做的是尝试解密该消息 由于您使用的是PKCS7填充,因此填充很可能无法解密,因为填充不符合设置的填充模式。

解密将引发异常,你必须抓住这个并在这种情况下返回false。

如果数据符合填充模式,则解密将很有可能通过(当消息未加密时)。然而,这是最不可能的。

在这种情况下,我要做的是在加密数据中添加某种标志,或者将一些数据附加到加密消息,因为我可以在解密中删除它。这将是最简单的方式。

答案 2 :(得分:2)

当你的函数返回一个字符串时,没有理由你不能将明文代码添加到IsEncrypted函数可以查找的加密数据的开头,比如说“MD5ENC”+ [密文]。

这样做的缺点是它会让拥有原始字符串的任何人知道用于加密的算法。但是,随着我们不断通过默默无闻提醒安全,根本就没有安全保障。任何人都应该被允许知道 的内容是如何加密的,并且没有简单的方法来破解加密。

请注意我使用 一词

无论如何,要回到我原来的建议。这样做的好处是,你对字符串的介绍代码越长,在另一个不相关的Base64加密字符串中偶然产生的机会就越小。

如果密文需要解密,只需剪掉你的标准长度加密识别代码,就可以了......