GPG автоматическая расшифровка пароля

Мы получаем зашифрованные GPG файлы от третьих лиц. Я изменяю программу на C#, которая находит зашифрованные файлы, расшифровывает их и удаляет зашифрованные. Все это работает, кроме как во время дешифрования, которое запрашивает фразу; Я знаю кодовую фразу, и она работает при вводе. Мне нужно передать парольную фразу в команде, чтобы подсказка никогда не появлялась.

string CommandText = string.Format("echo {0}|gpg.exe --keyring {1} --secret-keyring {2} --batch --yes --passphrase-fd 0 -o {3} -d {4}",
                passPhrase, publicKeyRingPath, secretKeyRingPath, outputFullPath, encryptedFilePath);

Я также попробовал:

    string CommandText = string.Format("gpg.exe --keyring {1} --secret-keyring {2} --batch --yes --passphrase {0} -o {3} -d {4}",
    string CommandText = string.Format("gpg.exe --keyring {1} --secret-keyring {2} --batch --yes --passphrase-fd {0} -o {3} -d {4}",

А также несколько других вариантов.

Это работает GnuPG для Windows 2.1.0.57899

В случае, если проблемы в другом месте, здесь есть код, в основном написанный моим предшественником:

public bool decryptInputFile(string encryptedFilePath, string outputFullPath, out string message)
{
    message = "decryptInputFile: Started";
    try
    {
        ProcessStartInfo psi = new ProcessStartInfo("cmd.exe")
        {
            CreateNoWindow = true,
            UseShellExecute = true,
            RedirectStandardInput = true,
            RedirectStandardOutput = true,
            RedirectStandardError = true,
            WorkingDirectory = decryptPath,
        };

        message = "decryptInputFile: PSI Initialized";
        using (Process process = Process.Start(psi))
        {
            string CommandText = string.Format("echo {0}|gpg.exe --keyring {1} --secret-keyring {2} --batch --yes --passphrase-fd 0 -o {3} -d {4}",
                                passPhrase, publicKeyRingPath, secretKeyRingPath, outputFullPath, encryptedFilePath);
            process.StandardInput.WriteLine(CommandText);
            process.StandardInput.Flush();
            process.StandardInput.Close();
            process.WaitForExit();
            process.Close();
            process.Dispose();
            message = "decryptInputFile: Success";


            //These processes don't close and it keeps the file from being deleted.
            foreach (Process P in Process.GetProcessesByName("gpg")) { P.Kill(); }
            foreach (Process P in Process.GetProcessesByName("gpg2")) { P.Kill(); }

        }
    }
    catch (Exception x)
    {
        // If there was an error, we're going to eat it and just let the user know we failed.
        message = "decryptInputFile: Error: " + x.Message;
        string errMessage = "ERROR: could not decrypt. " + x.Message + "\r\n";
        File.AppendAllText(System.Configuration.ConfigurationSettings.AppSettings["LogPath"], errMessage);

        return false;
    }

    if (File.Exists(outputFullPath) && File.Exists(encryptedFilePath))
    {
        File.Delete(encryptedFilePath);
    }
    return File.Exists(outputFullPath);
}

2 ответа

Решение

Эта проблема

Вы используете GnuPG 2, который позволяет только --passphrase* варианты вместе с --batch,

С помощью --batch

--passphrase* параметры предназначены для использования в сценариях. GnuPG 2 ограничивает их (вероятно, из-за медленной их отмены) --batch режим, в котором GnuPG не выполняет никакого взаимодействия (например, запрашивая вашу фразу-пароль или другие "диалоги").

Хотя это все еще возможно, может быть предпочтительнее использовать предварительную настройку пароля в gpg-agent вместо этого, что позволяет полностью удалить ключевую фразу из кода приложения. Обратите внимание на последствия --passphrase (все пользователи вашей системы могут читать его, пока работает GnuPG!) и --passphrase-file (фраза-пароль хранится на жестком диске, следите за разрешениями).

Предварительная настройка парольной фразы

Предпочтительным методом с GnuPG 2 является предварительная установка парольной фразы в gpg-agent, на который GnuPG сильно полагается; в случае GnuPG 2.1 чётное управление полностью выполняет операции с закрытым ключом и парольной фразой.

Но, к вашему спасению, GnuPG 2 предоставляет новый инструмент, gpg-preset-passphrase, На Debian Linux он прячется в /usr/lib/gnupg2/Я не знаю, где он хранится в Windows.

От man gpg-preset-passphrase:

gpg-preset-passphrase утилита для заполнения внутреннего кеша gpg-agent с парольными фразами. Это в основном полезно для необслуживаемых машин, где обычные pinentry инструмент нельзя использовать, а пароли для используемых ключей даются при запуске машины.

[...]

gpg-preset-passphrase вызывается следующим образом:

gpg-preset-passphrase [options] [command] cacheid

cacheid это либо 40-символьная рукоятка из шестнадцатеричных символов, обозначающая ключ, для которого должна быть установлена ​​или очищена ключевая фраза. [...]

Необходимо указать один из следующих параметров команды:

--preset
    Preset a passphrase. This is what you usually will use.
    gpg-preset-passphrase will then read the passphrase from stdin.

В завершение, при инициализации GnuPG для вашего приложения (и в интервалах, соответствующих настроенному времени кэширования), запустите gpg-preset-passphrase --preset [fingerprint], который будет читать парольную фразу из стандартного ввода или дополнительно использовать --passphrase passphrase возможность напрямую установить его в вашем запросе. Имейте в виду, что при использовании как эхо, так и --passphrase подход, другие пользователи системы могут получить парольную фразу, перечислив процессы; лучше прямо в процесс написать ' stdin из C#.

Я попробовал принятый ответ, но не сработал.

я был на Ubuntu 20.04.1 LTS

Проверьте мой ответ , который сработал для меня

Другие вопросы по тегам