如何使用 AES 自动加密

How to automate encryption using AES

我目前正在尝试为 SQL 数据库的备份实施 C# 加密程序。数据库 运行 在不支持自动备份加密的 SQL Express 服务器上。我正在使用一个免费的 SQL 备份应用程序来创建数据库的定期备份。这些是未加密的,所以我试图创建一个程序来加密它们。

我有一个看起来像这样的方法。

private static void FileEncrypt(string inputFile, string password)
{


    byte[] salt = GenerateRandomSalt();

    FileStream fsCrypt = new FileStream(inputFile + ".aes", FileMode.Create);

    byte[] passwordBytes = System.Text.Encoding.UTF8.GetBytes(password);

    Aes AES = Aes.Create();
    AES.KeySize = 256;
    AES.BlockSize = 128;
    AES.Padding = PaddingMode.PKCS7;

    var key = new Rfc2898DeriveBytes(passwordBytes, salt, 50000);
    AES.Key = key.GetBytes(AES.KeySize / 8);
    AES.IV = key.GetBytes(AES.BlockSize / 8);


    AES.Mode = CipherMode.CFB;

    fsCrypt.Write(salt, 0, salt.Length);

    CryptoStream cs = new CryptoStream(fsCrypt, AES.CreateEncryptor(), CryptoStreamMode.Write);

    FileStream fsIn = new FileStream(inputFile, FileMode.Open);

    byte[] buffer = new byte[1048576];
    int read;

    try
    {
        while ((read = fsIn.Read(buffer, 0, buffer.Length)) > 0)
        {
            cs.Write(buffer, 0, read);
        }

        // Close up
        fsIn.Close();
    }
    catch (Exception ex)
    {
        Console.WriteLine("Error: " + ex.Message);
    }
    finally
    {
        cs.Close();
        fsCrypt.Close();
    }
}

该方法使用提供的密码创建密钥并使用它来加密文件。我还有一个解密方法,它也接受路径和密码并反转操作。如果用户提供密码,这一切都非常有效。

当我尝试自动化该过程时出现问题。我不能让用户在每次文件需要加密时都输入密码,但我不知道如何向该方法提供密码。

我显然无法将明文密码存储在某个地方以供读取。我知道散列通常用于安全地存储密码。根据用户的密码创建并存储一个散列,然后当用户输入他们的密码时重新创建一个散列,如果它与存储在系统上的散列相匹配,它就会对用户进行身份验证。然而,这让我回到了用户输入密码的状态,这是我试图避免的。

理想情况下,我希望用户提供一次密码,然后所有传入的文件都将使用该密码加密。当用户需要其中一个文件时,他们将再次提供将文件解密回其原始状态的密码。

我对密码学还很陌生,所以我可能误解了一些事情。我已经厌倦了查看这个问题,但似乎找不到解决方案。

这种凭据通常存储在应用程序配置(应用程序机密)中。安全性在操作系统级别进行管理 - 例如。通过限制指定用户对文件的访问。这可能是最简单的方法,但也是最不安全的。

(仅限 Windows)另一种安全存储密码的方法是使用 CredentialManager 来保存/读取密码。

如果您在 eg 上托管您的应用程序。 Azure,您可以使用 Azure Key Vault 以安全的方式存储机密。

在这种情况下,散列密码和以安全方式存储密码是两件不同的事情。

一种选择是使用 public-key 密码学。 IE。你会生成一个 public 和私有的 key-pair。加密程序会生成一个随机的 AES 密钥。该密钥将使用 public 密钥加密并作为数据的一部分存储。然后可以使用 AES 密钥对其余数据进行加密。加密程序只需要访问 public 密钥,一旦 AES 密钥在内存中被覆盖,就无法解密任何数据。

解密程序会反向工作,使用私钥首先解密 AES 密钥,然后使用该密钥解密其余数据。此过程的一个潜在问题是确保在出现故障时可以访问私钥。所以我强烈建议测试恢复过程。

有关详细信息,请参阅 Cryptographic services。还要考虑如果攻击者可以访问您的备份服务器,他可能也可以访问实时数据。因此,如果备份的存储安全性低于您的实时数据,备份加密可能会更有价值。