Основные вопросы по использованию Keystore - PullRequest
4 голосов
/ 27 июля 2010

У меня есть приложение, которое генерирует SecretKeys, по одному на каждого клиента.Они должны быть сохранены в нашей базе данных.Я ДЕЙСТВИТЕЛЬНО незнаком с общими шаблонами или реализациями безопасности и ищу совет.

Класс KeyStore, кажется, широко используется, особенно для защиты SecretKeys.Тем не менее, я видел мало упоминаний об использовании KeyStore с базами данных, и я пытаюсь выяснить, потому ли это, что это элементарное использование (и, следовательно, не упоминается), или это потому, что это плохой или избыточный подход, и я должен действительноиспользовать другую технику.

Основной дизайн состоит в том, что у каждого пользователя будет свое собственное хранилище ключей, которое будет сохранено / загружено в базу данных и из нее путем преобразования в байты (с использованием load () и store (),Я думаю).

Что-нибудь не так с этим дизайном до сих пор?Мне также интересно, как я должен обработать пароль для хранилища ключей.Мы думаем об использовании только одного пароля для всех хранилищ ключей, но как мы можем надежно хранить ЭТО без хранилища ключей?

Это предназначено для использования в фоновом приложении, и клиент никогда не передаст нам пароль, а на стороне сервера не будет оператора-человека, который бы предоставил пароль.

Ответы [ 2 ]

4 голосов
/ 27 июля 2010

В реальном мире секретные ключи надежно хранятся (выделено мной) в HSM , если они предназначены для безопасного хранения в течение длительного периода времени (в диапазонеот часов до лет).Существует стандарт PKCS # 11 , который призван помочь в взаимодействии с такими системами, но я скажу меньше всего - большинство HSM имеют свои собственные предпочтительные механизмы для взаимодействия с HSM и PKCS # 11.Интерфейс обычно оказывается поврежденным.

Секретные ключи также можно безопасно хранить на других устройствах, таких как смарт-карты и USB-токены, но это предназначено для распределения ключей среди массового населения, а не для хранения ключей длявнутренняя система.

Однако не каждый получает бюджет для HSM, и используется множество других менее безопасных (и, очевидно, более дешевых) альтернатив.Некоторые системы (я использую сервер приложений Glassfish) хранят мастер-пароль, который используется для защиты других паролей.То же самое относится и к ключам - там будет главный ключ, который используется для защиты других ключей (в некотором смысле, это похоже на то, как HSM работает внутри).Конечно, вы застряли с защитой мастер-ключа.В некоторых средах это легко, поскольку вы можете поместить ключ в файл, доступ к которому разрешен только системному администратору и приложению, и никому другому.

Отказ от ответственности : ничего из этогоследует рассматривать как совет, который следует принимать вслепую :-).Если ваши ключи необходимо защитить любой ценой, инвестируйте в HSM.

3 голосов
/ 08 марта 2013

Итак, вы используете java и хранилища ключей.

У вас есть 2 вопроса, которые я правильно понимаю?:

1) вам нужен совет

2), который вы хотите знатькак сохранить этот материал в БД

Ответ на вопрос 1: Так что при использовании Java вам нужно использовать SSL.В Java уже есть реализации классов, которые будут взаимодействовать через https, и они будут выполнять рукопожатие SSL и все для вас!Единственное, что вам нужно сделать, это предоставить java.security.KeyStore для этой реализации.

Существует в основном 2 типа хранилищ ключей:

  • первыйдля хранения всех сертификатов, которым вы доверяете (несколько сертификатов) => Keystore.getInstance ("JKS")

  • во-вторых, необходимо сохранить сертификат клиента (только один) с его закрытым ключом => Keystore.getInstance ("PKCS12");

Как вы создаете свои личные ключи и сертификаты, я не буду обсуждать это здесь.Я предполагаю, что вы уже там .. (а если нет, вы можете узнать).Но KeyStores защищены паролем.Так что в целом они безопасны, если никто не может просто взломать вашу базу данных.Если вы храните пароль для открытия хранилища ключей в той же таблице, то следите за внедрением SQL!Но давайте предположим, что это безопасно. Хранилища ключей предоставляют вам возможность использовать существующую реализацию, которая будет обрабатывать рукопожатие SSL.Так что в принципе неплохо пользоваться хранилищами ключей.Примечание. Между прочим, вы будете использовать хранилище ключей PKCS12 только тогда, когда требуется взаимная аутентификация (то есть вам также необходимо идентифицировать себя).

Ответ на вопрос2: Да, вы можете хранить хранилища ключей в базе данных, это немного сложно.Поскольку хранилища ключей позволяют им использовать только методы хранения и загрузки.Но вы можете достичь этого следующим образом:

@Entity
public class MyKeyStoreClass {
private Long id;
@Transient
private KeyStore keystore;
private String passwordForKeyStore;
private Byte[] keyStoreAsBytes;

@PreUpdate
@PrePersist
public void concertKeyStoreToBytes() {
   ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
        keystore.store(byteArrayOutputStream,
                passwordForKeyStore.toCharArray());
   keyStoreAsBytes = byteArrayOutputStream.toByteArray();
}

@PostLoad
public void getKeyStore() {
   if (keystore == null && keyStoreAsBytes != null) {
      keyStore = KeyStore.getInstance(getKeystoreType().getType());
      keyStore.load(new ByteArrayInputStream(keystoreAsBytes), passwordForKeyStore.toCharArray()); 
   }    
}

Приведенный выше код, вероятно, не на 100% правильный, так как я написал его здесь (без редактора).Но обычно это то, как вы могли бы это сделать, я делал это раньше, и это сработало, так что удачи;) Обратите внимание, что моя конфигурация Spring выполняет аннотированные методы до или после сохранения или обновления.Если вы не используете аннотации и пружину, вы можете добиться этого другим способом.

...