Итак, вы используете 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 выполняет аннотированные методы до или после сохранения или обновления.Если вы не используете аннотации и пружину, вы можете добиться этого другим способом.