Как использовать открытый ключ OpenPGP(GPG) без доступа к физическому брелоку в Java
Настроить:
- Linux с GnuPG или Windows с GPG4Win(OpenPGP)
- Пара ключей RSA 2048 была создана привилегированным пользователем, который может получить доступ к кольцу ключей
- Второй пользователь с более низкими правами был создан для запуска приложения Java под
- Этому пользователю предоставлено разрешение на запуск команд GPG, но он не может получить доступ к файлам физических ключей.
- Идентификаторы ключей известны приложению Java, как и парольная фраза для извлечения закрытого ключа.
- Java-приложение импортировало библиотеку Bouncycastle
- Java-программа должна выполнить шифрование и дешифрование с использованием пары ключей
Проблема:
Я успешно выполнил шифрование и дешифрование с помощью Bouncycastle. Но это включало в себя попытку чтения открытых и закрытых ключей из файлов публикации и сохранения. В целях безопасности я бы предпочел, чтобы приложение java не имело прямого доступа к файлам ключей.
Какие у меня варианты. Есть ли варианты в Bouncycastle, чтобы сделать это, не читая кольца ключей или экспортируя ключи в отдельные файлы?
Примечание: использование Надувного замка не обязательно.
2 ответа
BouncyCastle требует прямого доступа к файлам ключей, как открытым, так и закрытым ключам.
Не используя BouncyCastle
Если вы хотите запретить Java-приложению доступ к файлам ключей, но по-прежнему использовать его для шифрования и дешифрования, возможно, вам удастся использовать GnuPG 2.1, который снимает все операции, требующие доступа к секретному ключу, к gpg-agent
, Настройка, которая может работать, будет выглядеть примерно так:
- Начните
gpg-agent
- Ограничьте доступ для вашего Java-приложения, чтобы оно могло
gpg-agent
сокет, но не файлы закрытого ключа
В Linux вы можете рассмотреть возможность использования chroot
или соответствующие разрешения для сокета и файлов ключей. В Windows может быть что-то вроде решения для песочницы.
Создание собственного демона BouncyCastle
Похож на малый вес gpg-agent
Вы могли бы написать свой собственный демон, который обрабатывает все операции с секретным ключом, не раскрывая ключ в одно и то же время (так что у вас есть маленький демон с гораздо меньшим шансом критических ошибок; в то время как большое, возможно, небезопасное и уязвимое основное приложение) может отправлять запросы на шифрование / дешифрование в приложение "агент").
Ваше Java-приложение может вызывать gnupg с любыми привилегиями, которыми обладает пользователь, выполняющий приложение. К счастью, gnupg поддерживает множество параметров командной строки, которые позволяют вам предоставить все необходимые аргументы и прочитать / собрать данные о состоянии и результатах, такие как -batch
, -options
или же -status-fd
, Вы можете вызывать программы из Java и читать их результаты обратно, используя Java ProcessBuilder или библиотеки более высокого уровня, такие как Plexus Utils.
С другой стороны, есть по крайней мере одна библиотека-оболочка на основе Java, которая напрямую взаимодействует с исполняемым файлом GnuPG. Хотя это зависит от платформы, это, вероятно, имеет преимущества в скорости перед порождением процесса для каждой транзакции; и, вероятно, сэкономит вам много усилий по реализации, выясняя параметры командной строки.
Обратите внимание, что при использовании GnuPG этот способ полностью обходит BouncyCastle - вы будете автоматизировать вызовы GnuPG, эффективно используя его в качестве "библиотеки".