2010-07-06 16 views
5

Estoy creando un servicio web que almacenará claves públicas y privadas para cada registro en una tabla de base de datos.Almacenamiento de claves públicas y privadas en una base de datos o almacén de claves

Las claves están hechas usando Java, pero no estoy seguro de que crear un almacén de claves o colocar las claves dentro de los campos en la base de datos directamente.

¿Qué opción recomendaría y cuáles son los beneficios de cada método?

Respuesta

5

Si utiliza un almacén de claves, utilizará una base de datos que se ha diseñado para mantener elementos cifrados, como claves y certificados.

Siempre que sea posible, no intente reinventar la rueda. ¿Será suficiente un almacén de claves en su problema? Si intenta diseñar su propia base de datos para almacenar estos artefactos, tendrá que volver a resolver problemas y problemas que ya se tuvieron en cuenta al crear bases de datos como el almacén de claves de Java.

+0

Cada registro en mi tabla tendrá que estar vinculado a las teclas en el almacén de claves de alguna manera. es decir. Necesito una forma de extraer automáticamente la clave privada del almacén de claves (así como la información de la base de datos) y cifrar un mensaje y luego enviarlo de vuelta al usuario. Entonces, ¿debería almacenar la contraseña del almacén de claves dentro del registro de la base de datos? ¿Cómo puedo solucionar este problema de una manera segura? Usted ve que hay más que solo la clave pública/privada por fila, tengo identificación, precio, nombre ... etc. – jax

1

¿Por qué cada registro tiene una clave privada? Este es un diseño muy extraño. Las claves privadas se ven generalmente en manos de las entidades, p. Personas o servidores que actúen en su nombre.

+0

Cada registro representa una aplicación. Entonces cada aplicación tendrá sus propias claves privadas y públicas. – jax

0

puede tener una base de datos para almacenar la información del usuario, no las claves, para las claves es mejor usar el almacén de claves. para que userinfo pueda contener {nombre, pase simétrico/hash, ...} y al usar el nombre, debe poder identificar el registro clave en el almacén de claves. Recuerde de nuevo, no use un global (usuario, pase) para leer el almacén de claves, use la concesión de usuario en su lugar.

2

Puede proporcionar almacenes de claves a las implementaciones ya existentes para el envío de datos a través de http, que buscará el almacén de claves y realizará todas las operaciones necesarias para que usted no tenga que hacerlo. Para la autenticación del lado del servidor, esto sería un keystore = KeyStore.getInstance ("JKS"), que contiene todos los certificados de confianza.

Para autenticación del lado del cliente, si corresponde (debe verificarse) también existe tal implementación donde simplemente proporciona su cliente 'keystore' => este contendrá su certificado y es clave privada => KeyStore. getInstance ("PKCS12")

Entonces, finalmente, desea almacenar estas cosas en la base de datos, aquí se pone un poco complicado ... Las tiendas de claves están seguras, por lo que no puede simplemente escribirlas. Tiene que usar el almacén de claves. tienda (OutputStream, contraseña) ..

Lo que me parece mejor es por ejemplo:

@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()); 
    }  
} 

El código anterior no es 100% correcto, pero te da una buena idea de lo que quiero decir, si no trabajas con las anotaciones, puedes hacerlo usando otro enfoque, pero creo que mi punto es claro;)

Cuestiones relacionadas