Как использовать открытый ключ 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, эффективно используя его в качестве "библиотеки".

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