CriptografĂ­a en Java. Clase KeyStore

Hola Habr! Le presento la traducciĂłn del artĂ­culo 9 del "Java KeyStore" de Jakob Jenkov de una serie de artĂ­culos para principiantes que desean aprender los conceptos bĂĄsicos de la criptografĂ­a en Java.


Tabla de contenido:


  1. CriptografĂ­a Java
  2. Cifrado de Java
  3. Messagedigest
  4. Mac
  5. Firma
  6. Par de llaves
  7. Generador de claves
  8. KeyPairGenerator
  9. Keystore
  10. Keytool
  11. Certificado
  12. CertificateFactory
  13. CertPath

Keystore


Java KeyStore es un almacĂ©n de claves de estilo de base de datos proporcionado por la clase KeyStore ( java.security.KeyStore ). El almacenamiento se puede escribir en el disco y leer de nuevo, se puede proteger con contraseña y cada registro de clave en el almacĂ©n de claves se puede proteger con su propia contraseña, lo que hace que la clase KeyStore un mecanismo Ăștil para trabajar con claves de cifrado de forma segura. Un almacĂ©n de claves puede contener claves de los siguientes tipos:


  • Claves privadas
  • Claves pĂșblicas y certificados (Claves pĂșblicas + certificados)
  • Llaves secretas

Las claves privadas y pĂșblicas se utilizan en cifrado asimĂ©trico. La clave pĂșblica puede tener un certificado asociado. Un certificado es un documento que prueba la identidad de una persona, organizaciĂłn o dispositivo que afirma poseer una clave pĂșblica. El certificado suele estar firmado digitalmente por la parte que confĂ­a como prueba. Las claves privadas se utilizan en cifrado simĂ©trico. En la mayorĂ­a de los casos, al configurar una conexiĂłn segura, las claves simĂ©tricas son inferiores a las asimĂ©tricas, por lo que la mayorĂ­a de las veces almacenarĂĄ claves pĂșblicas y privadas en el almacĂ©n de claves.


Crear un almacén de claves


Puede crear una instancia de KeyStore llamando a su método getInstance() . Aquí hay un ejemplo de cómo crear una instancia de una clase:


 KeyStore keyStore = KeyStore.getInstance(KeyStore.getDefaultType()); 

Este ejemplo crea una instancia predeterminada de KeyStore . También puede crear instancias de KeyStore con un formato de almacenamiento de clave diferente pasando un paråmetro al método getInstance() . Por ejemplo, crear una instancia del almacén de claves PKCS12 :


 KeyStore keyStore = KeyStore.getInstance("PKCS12"); 

Descargar el almacén de claves


Antes de poder usar una instancia de un almacén de claves, debe descargarla. Las instancias de la clase KeyStore menudo se escriben en el disco u otro almacenamiento para su uso posterior, porque la clase KeyStore supone que debe leer sus datos antes de poder usarlos. Sin embargo, puede inicializar una instancia de KeyStore vacía sin datos, como verå mås adelante.


Los datos se cargan desde un archivo u otro almacenamiento llamando al método load() , que toma dos paråmetros:


  • InputStream desde el cual se cargarĂĄn los datos.
  • char[] Una matriz de caracteres que contiene la contraseña del almacĂ©n de claves.

Aquí hay un ejemplo de cómo cargar un almacén de claves:


 char[] keyStorePassword = "123abc".toCharArray(); try(InputStream keyStoreData = new FileInputStream("keystore.ks")){ keyStore.load(keyStoreData, keyStorePassword); } 

Este ejemplo carga el archivo de almacĂ©n de claves keystore.ks. Si no desea cargar ningĂșn dato en el almacĂ©n de claves, simplemente pase null para el parĂĄmetro InputStream . AsĂ­ es como se carga un almacĂ©n de claves vacĂ­o:


 keyStore3.load(null, keyStorePassword); 

Una instancia de la clase KeyStore siempre debe cargarse con datos o null . De lo contrario, el almacén de claves no se inicializa y todas las llamadas a sus métodos arrojarån excepciones.


Recibiendo llaves


Puede obtener las claves de una instancia de la clase KeyStore través de su método getEntry() . El registro del almacén de claves se asigna a un alias que identifica la clave y estå protegido con contraseña. Por lo tanto, para acceder a la clave, debe pasar el alias de la clave y la contraseña al método getEntry() . Aquí hay un ejemplo de acceso de escritura a una instancia de KeyStore :


 char[] keyPassword = "789xyz".toCharArray(); KeyStore.ProtectionParameter entryPassword = new KeyStore.PasswordProtection(keyPassword); KeyStore.Entry keyEntry = keyStore3.getEntry("keyAlias", entryPassword); 

Si sabe que el registro al que desea acceder es la clave privada, puede convertir la instancia de KeyStore.Entry a KeyStore.PrivateKeyEntry . AsĂ­ es como se ve:


 KeyStore.PrivateKeyEntry privateKeyEntry = (KeyStore.PrivateKeyEntry) keyStore3.getEntry("keyAlias", entryPassword); 

Después de KeyStore.PrivateKeyEntry a KeyStore.PrivateKeyEntry puede acceder a la clave privada, el certificado y la cadena de certificados utilizando los siguientes métodos:


  • getPrivateKey()
  • getCertificate()
  • getCertificateChain()

Almacenamiento de claves


También puede poner claves en una instancia de la clase KeyStore . Un ejemplo de colocación de una clave secreta (clave simétrica) en una instancia de KeyStore :


 SecretKey secretKey = getSecretKey(); KeyStore.SecretKeyEntry secretKeyEntry = new KeyStore.SecretKeyEntry(secretKey); keyStore3.setEntry("keyAlias2", secretKeyEntry, entryPassword); 

Almacenamiento


A veces es posible que desee guardar el almacĂ©n de claves en algĂșn tipo de almacenamiento (disco, base de datos, etc.) para poder cargarlo nuevamente en otro momento. Una instancia de la clase KeyStore guarda llamando al mĂ©todo store() . Un ejemplo:


 char[] keyStorePassword = "123abc".toCharArray(); try (FileOutputStream keyStoreOutputStream = new FileOutputStream("data/keystore.ks")) { keyStore3.store(keyStoreOutputStream, keyStorePassword); } 

Source: https://habr.com/ru/post/445786/


All Articles