Hay ocasiones en las que necesitamos almacenar credenciales en un lugar seguro, evitando agregarlas en el código como HARD CODE, para los que no estén familiarizados con este termino significa que dentro de nuestro código de programación establezcamos directamente passwords o algún dato sensible y no lo obtengamos desde una fuente confiable, como una base de datos o un archivo encriptado, inclusive algún archivo de texto como los properties.
El archivo con extencion jks nos ayuda a guardar nuestras claves y certificados de manera mas segura, Java KeyStore es un archivo de almacenamiento de claves java, en el podemos almacenar desde credenciales USUARIO-CONTRASEÑA y certificados .CER.
En java tenemos una clase especial para manipular funciones y procedimientos para archivos .jks, esta clase es java.security.KeyStore que se encarga de manejar 3 tipos de entradas:
KeyStore.PrivateKeyEntry
Este tipo de entrada contiene un PrivateKey criptografico, que opcionalmente se almacena en un formato protegido para evitar el acceso no autorizado. También se acompaña de una cadena de certificados para la clave pública correspondiente.
Las claves privadas y las cadenas de certificados son utilizadas por una entidad dada para la autenticación propia. Las aplicaciones para esta autenticación incluyen organizaciones de distribución de software que firman archivos JAR como parte del lanzamiento y / o licencia de software.
KeyStore.SecretKeyEntry
Este tipo de entrada contiene un criptográfico SecretKey, que opcionalmente se almacena en un formato protegido para evitar el acceso no autorizado.
KeyStore.TrustedCertificateEntry
Este tipo de entrada contiene una única clave pública que Certificate pertenece a otra parte. Se denomina certificado de confianza porque el propietario del almacén de claves confía en que la clave pública del certificado pertenece a la identidad identificada por el sujeto (propietario) del certificado.
Cada entrada en un almacén de claves se identifica mediante una cadena de “alias”. En el caso de las claves privadas y sus cadenas de certificados asociadas, estas cadenas distinguen entre las diferentes formas en que la entidad puede autenticarse. Por ejemplo, la entidad puede autenticarse usando diferentes autoridades de certificación o usando diferentes algoritmos de clave pública.
Si los alias distinguen entre mayúsculas y minúsculas depende de la implementación. Para evitar problemas, se recomienda no utilizar alias en un KeyStore que solo difieran en las mayúsculas y minúsculas.
Las formas típicas de solicitar un objeto KeyStore incluyen confiar en el tipo predeterminado y proporcionar un tipo de almacén de claves específico.
Para confiar en el tipo predeterminado:
KeyStore ks = KeyStore.getInstance (KeyStore.getDefaultType ());
El sistema devolverá una implementación de almacén de claves para el tipo predeterminado.
Para proporcionar un tipo de almacén de claves específico:
KeyStore ks = KeyStore.getInstance (“JKS”);
El sistema devolverá la implementación más preferida del tipo de almacén de claves especificado disponible en el entorno.
Antes de poder acceder a un almacén de claves, debe serlo loaded (Cargado).
KeyStore ks = KeyStore.getInstance (KeyStore.getDefaultType ());
// obtener contraseña de usuario y flujo de entrada de archivo
char [] contraseña = getPassword ();
java.io.FileInputStream fis = null;
try {
fis = new java.io.FileInputStream (“keyStoreName”);
ks.load (fis, contraseña);
} finally {
if (fis! = null) {
fis.close ();
}
}
Para crear un almacén de claves vacío utilizando el método anterior, pase null como argumento en InputStream de load (ks.load (null, contraseña)).
Una vez que se ha cargado el almacén de claves, es posible leer las entradas existentes del almacén de claves o escribir nuevas entradas en el almacén de claves:
// obtener mi clave privada
KeyStore.PrivateKeyEntry pkEntry = (KeyStore.PrivateKeyEntry)
ks.getEntry (“privateKeyAlias”, contraseña);
PrivateKey myPrivateKey = pkEntry.getPrivateKey ();
// guardar mi clave secreta
javax.crypto.SecretKey mySecretKey;
KeyStore.SecretKeyEntry skEntry =
nuevo KeyStore.SecretKeyEntry (mySecretKey);
ks.setEntry (“secretKeyAlias”, skEntry,
nuevo KeyStore.PasswordProtection (contraseña));
// guarda el almacén de claves
java.io.FileOutputStream fos = null;
try {
fos = new java.io.FileOutputStream (“newKeyStoreName”);
ks.store (fos, contraseña);
} finally {
if (fos! = null) {
fos.close ();
}
}
Tenga en cuenta que aunque se puede usar la misma contraseña para cargar el almacén de claves, para proteger la entrada de clave privada, para proteger la entrada de clave secreta y para almacenar el almacén de claves (como se muestra en el código de ejemplo anterior), diferentes contraseñas u otros parámetros de protección También puede ser utilizado.
En siguientes post veremos un ejemplo para entender mejor el funcionamiento de esta clase.