Хранение открытых и закрытых ключей в базе данных или хранилище ключей - PullRequest
5 голосов
/ 06 июля 2010

Я делаю веб-сервис, который будет хранить открытые и закрытые ключи для каждой записи в таблице базы данных.

Ключи создаются с использованием Java, но я не уверен, что создать хранилище ключей или разместить ключивнутренние поля в базе данных напрямую.

Какой вариант вы бы порекомендовали и каковы преимущества каждого метода?

Ответы [ 4 ]

5 голосов
/ 06 июля 2010

Если вы используете хранилище ключей, вы будете использовать базу данных, предназначенную для хранения зашифрованных элементов, таких как ключи и сертификаты.

Везде, где возможно, вы не должны пытаться заново изобретать колесо. Хватит ли хранилища ключей в вашей проблеме? Если вы попытаетесь создать собственную базу данных для хранения этих артефактов, вам придется заново решать проблемы и проблемы, которые были учтены уже при создании баз данных, таких как хранилище ключей Java.

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

Вы можете предоставить хранилища ключей для уже существующих реализаций для отправки данных по http, который извлечет хранилище ключей и выполнит все необходимые действия, так что вам не придется это делать.Для аутентификации на стороне сервера это будет хранилище ключей = KeyStore.getInstance ("JKS"), содержащее все доверенные сертификаты.

Для аутентификации на стороне клиента, если применимо (необходимо проверить себя), также такая реализацияуже существует, где вы просто предоставляете своему клиенту «хранилище ключей» => это будет содержать ваш сертификат и его закрытый ключ => KeyStore.getInstance («PKCS12»)

Затем, наконец, вы хотите сохранить эти вещи в базе данных,здесь это становится немного сложнее .. Keystores защищены, так что вы не можете просто записать это .. вы должны использовать keystore.store (OutPutstream, пароль) ..

Что я считаю лучшим, например,:

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

1 голос
/ 06 июля 2010

Почему у каждой записи есть закрытый ключ?Это очень странный дизайн.Под закрытыми ключами обычно понимают объекты, например пользователи или серверы, действующие от их имени.

0 голосов
/ 20 октября 2010

у вас может быть база данных для хранения информации о пользователе, а не ключей, для ключей лучше использовать хранилище ключей. Таким образом, userinfo может содержать {имя, симметричный пароль / хэш, ...} и, используя имя, вы сможете идентифицировать запись ключа в хранилище ключей. Опять же, помните: не используйте глобальный (пользователь, пароль) для чтения хранилища ключей, вместо этого используйте пользовательское разрешение.

...