Aplicaciones Criptográficas Java

94
Aplicaciones Aplicaciones Criptográficas Java Criptográficas Java Proyecto Fin de Carrera Facultad de Informática Universidad de Las Palmas de Gran Canaria Autor: Jesús María Ramos Saky Tutor: Miguel Ángel Pérez Aguiar 24/05/06 http:// jcef.sourceforge.ne t

description

Aplicaciones Criptográficas Java. http://jcef.sourceforge.net. Proyecto Fin de Carrera Facultad de Informática Universidad de Las Palmas de Gran Canaria. Autor: Jesús María Ramos Saky. Tutor: Miguel Ángel Pérez Aguiar. 24/05/06. Breve descripción (1/4). Breve descripción (2/4). - PowerPoint PPT Presentation

Transcript of Aplicaciones Criptográficas Java

Page 1: Aplicaciones Criptográficas Java

Aplicaciones Criptográficas Aplicaciones Criptográficas JavaJava

Proyecto Fin de Carrera

Facultad de Informática

Universidad de Las Palmas de Gran Canaria

Autor: Jesús María Ramos Saky

Tutor: Miguel Ángel Pérez Aguiar24/05/06

http://jcef.sourceforge.net

Page 2: Aplicaciones Criptográficas Java

Breve descripción Breve descripción (1/4)(1/4)

Page 3: Aplicaciones Criptográficas Java

• El objetivo es “Aprender a utilizar mecanismos criptográficos para asegurar objetos y volver a recuperarlos: Protección y Autentificación”.

• El resultado del proyecto:

• Conjunto librerías Java sobre algoritmos criptográficos.

• Destacando JCEF (Java Cryptographic Extension Framework).

Breve descripción Breve descripción (2/4)(2/4)

Page 4: Aplicaciones Criptográficas Java

• JCEF (Java Cryptographic Extension Framework):

• Es útil y sobre todo de muy fácil uso.

• Ideal para usuarios inexpertos.

• Suplanta a las librerías criptográficas Java estándar llamadas JCA y JCE.

Breve descripción Breve descripción (3/4)(3/4)

Page 5: Aplicaciones Criptográficas Java

• Como un EJEMPLO del valor añadido de este proyecto observen cómo se asegura un objeto y se vuelve a recuperar con suma facilidad:

/* 1. */ Object object = new String(“my object”);

/* 2. */ CryptoAlgorithm secureAlgorithm = new AES_BlockSymmetricProtectionRREXKY();

/* 3. */ SecureObject secureObject = new SecureObject(object, secureAlgorithm);

/* 4. */ Object = (String)secureObject.getObject(secureAlgorithm);

Breve descripción Breve descripción (4/4)(4/4)

Page 6: Aplicaciones Criptográficas Java

Introducción

Introducción a la seguridad

Page 7: Aplicaciones Criptográficas Java

Introducción a la seguridad Introducción a la seguridad (1/9)(1/9)

La seguridad es muy importante hoy día

Page 8: Aplicaciones Criptográficas Java

Introducción a la seguridad Introducción a la seguridad (2/9)(2/9)

Evitar que se obtengan documentos de forma ilegal.

Page 9: Aplicaciones Criptográficas Java

Introducción a la seguridad Introducción a la seguridad (3/9)(3/9)

Evitar que se obtenga información sobre los comunicantes.

Page 10: Aplicaciones Criptográficas Java

Introducción a la seguridad Introducción a la seguridad (4/9)(4/9)

Evitar que se pueda suplantar una identidad

Page 11: Aplicaciones Criptográficas Java

Introducción a la seguridad Introducción a la seguridad (5/9)(5/9)

Evitar que se puedan repetir mensajes sin ser detectada tal repetición

Page 12: Aplicaciones Criptográficas Java

Introducción a la seguridad Introducción a la seguridad (6/9)(6/9)

Evitar la modificación de mensajes antes de llegar a su destinatario

Page 13: Aplicaciones Criptográficas Java

Introducción a la seguridad Introducción a la seguridad (7/9)(7/9)

Evitar la interrupción de sus servicios

Page 14: Aplicaciones Criptográficas Java

Introducción a la seguridad Introducción a la seguridad (8/9)(8/9)

Los servicios de seguridad solucionan o previenen los ataques

Page 15: Aplicaciones Criptográficas Java

Introducción a la seguridad Introducción a la seguridad (9/9)(9/9)

Y para implementar estos servicios, se utiliza principalmente la Criptografía.

Page 16: Aplicaciones Criptográficas Java

Introducción

Criptografía Orientada a Objetos

Page 17: Aplicaciones Criptográficas Java

Criptografía OO Criptografía OO (1/8)(1/8)

La Criptografía es una herramienta que permite:– Asegurar objetos.– Y recuperar objetos asegurados.

Page 18: Aplicaciones Criptográficas Java

Criptografía OO Criptografía OO (2/8)(2/8)

La Criptografía gestiona objetos seguros:– Protegidos y/o Autentificables

Page 19: Aplicaciones Criptográficas Java

Criptografía OO Criptografía OO (3/8)(3/8)

Page 20: Aplicaciones Criptográficas Java

Criptografía OO Criptografía OO (4/8)(4/8)

Page 21: Aplicaciones Criptográficas Java

Criptografía OO Criptografía OO (5/8)(5/8)

Page 22: Aplicaciones Criptográficas Java

Criptografía OO Criptografía OO (6/8)(6/8)

Es auténtico sólo si la huella de éste objeto es la misma que la adjunta

Page 23: Aplicaciones Criptográficas Java

Criptografía OO Criptografía OO (7/8)(7/8)

A diferencia de la huella digital, los sellos digitales proporcionan un mayor nivel de seguridad al utilizar una clave simétrica tanto para la generación como para la verificación

Page 24: Aplicaciones Criptográficas Java

Criptografía OO Criptografía OO (8/8)(8/8)

Finalmente, las firmas digitales proporcionan el mayor nivel de seguridad de todos los tipos de autentificación al utilizar claves asimétricas, evitándose así distribuir la clave de firmado.

Page 25: Aplicaciones Criptográficas Java

Introducción

Análisis de JCA y JCE

Page 26: Aplicaciones Criptográficas Java

Análisis de JCA y JCE Análisis de JCA y JCE (1/40)(1/40)

El uso más habitual de la criptografía:– Crear objetos seguros– Obtener objetos asegurados– Con parámetros generados

recientemente– O reutilizando parámetros

Page 27: Aplicaciones Criptográficas Java

Análisis de JCA y JCE Análisis de JCA y JCE (2/40)(2/40)

1. Asegurar un objeto con nuevos parámetros criptográficos

2. Almacenar parámetros criptográficos para un uso posterior

3. Obtener el objeto asegurado utilizando los nuevos parámetros criptográficos

4. Asegurar otro objeto reutilizando parámetros criptográficos ya existentes

5. Obtener el objeto asegurado reutilizando parámetros criptográficos ya existentes

Page 28: Aplicaciones Criptográficas Java

Análisis de JCA y JCE Análisis de JCA y JCE (3/40)(3/40)

1. Asegurar un objeto con nuevos parámetros criptográficos

1.1. Definición del objeto a asegurar y carga del proveedor1.2. Definición del generador de claves simétricas 1.3. Inicialización del generador de claves simétricas y

generación de la clave 1.4. Definición del generador de parámetros 1.5. Inicialización del generador de parámetros 1.6. Generación del parámetro 1.7. Definición del algoritmo de seguridad 1.8. Inicialización del algoritmo de seguridad 1.9. Obtención del parámetro que se haya podido generar

automáticamente1.10. Creación del objeto seguro

Page 29: Aplicaciones Criptográficas Java

Análisis de JCA y JCE Análisis de JCA y JCE (4/40)(4/40)

2. Almacenar parámetros criptográficos para un uso posterior2.1. Traducción de la clave

2.2. Traducción del parámetro

2.3. Otra traducción del parámetro

2.4. Almacenamiento de los parámetros

Page 30: Aplicaciones Criptográficas Java

Análisis de JCA y JCE Análisis de JCA y JCE (5/40)(5/40)

3. Obtener el objeto asegurado utilizando los nuevos parámetros criptográficos3.1. Carga de los parámetros

3.2. Definición del algoritmo de seguridad

3.3. Traducción de los parámetros a la forma adecuada

3.4. Inicialización del algoritmo de seguridad para desprotección

3.5. Obtención del objeto asegurado

Page 31: Aplicaciones Criptográficas Java

Análisis de JCA y JCE Análisis de JCA y JCE (6/40)(6/40)

4. Asegurar otro objeto reutilizando parámetros criptográficos ya existentes4.1. Definición del objeto y carga de los parámetros

4.2. Traducción de la clave a su forma adecuada

4.3. Traducción del parámetro a su forma adecuada

4.4. Definición del algoritmo de seguridad

4.5. Inicialización del algoritmo de seguridad para protección

4.6. Obtención del parámetro si fuera generado automáticamente

4.7. Creación del objeto seguro

Page 32: Aplicaciones Criptográficas Java

Análisis de JCA y JCE Análisis de JCA y JCE (7/40)(7/40)

5. Obtener el objeto asegurado reutilizando parámetros criptográficos ya existentes5.1. Carga de los parámetros

5.2. Definición del algoritmo de seguridad

5.3. Traducción de la clave a su forma adecuada

5.4. Traducción del parámetro a su forma adecuada

5.5. Inicialización del algoritmo de seguridad para desprotección

5.6. Obtención del objeto asegurado

Page 33: Aplicaciones Criptográficas Java

Análisis de JCA y JCE Análisis de JCA y JCE (8/40)(8/40)

1. Asegurar un objeto con nuevos parámetros criptográficos1.1. Definición del objeto a asegurar y carga del proveedor

String object = "my object";

Provider provider = new BouncyCastleProvider();

Security.addProvider(provider);

String providerName = provider.getName();

Page 34: Aplicaciones Criptográficas Java

Análisis de JCA y JCE Análisis de JCA y JCE (9/40)(9/40)

1. Asegurar un objeto con nuevos parámetros criptográficos1.2. Definición del generador de claves simétricas

SecureRandom random = null; Key key = null;

javax.crypto.KeyGenerator keyGenerator = null;

try { keyGenerator = javax.crypto.KeyGenerator.getInstance("AES", providerName); }

catch (NoSuchAlgorithmException e) { e.printStackTrace(); return; }

catch (NoSuchProviderException e) { e.printStackTrace(); return; }

Page 35: Aplicaciones Criptográficas Java

Análisis de JCA y JCE Análisis de JCA y JCE (10/40)(10/40)

1. Asegurar un objeto con nuevos parámetros criptográficos1.3. Inicialización del generador de claves simétricas y generación de la clave

int keySize = 256; AlgorithmParameterSpec genParameter = null;

if (genParameter != null && random == null) {

try { keyGenerator.init(genParameter); }

catch (InvalidAlgorithmParameterException e) { e.printStackTrace(); return; }

} else if (genParameter != null && random != null) {

try { keyGenerator.init(genParameter, random); }

catch (InvalidAlgorithmParameterException e) { e.printStackTrace(); return; }

} else if (genParameter == null && keySize > 0 && random == null) {

keyGenerator.init(keySize);

} else if (genParameter == null && keySize > 0 && random != null) {

keyGenerator.init(keySize, random);

} else if (genParameter == null && keySize <= 0 && random != null) {

keyGenerator.init(random);

key = keyGenerator.generateKey();

Page 36: Aplicaciones Criptográficas Java

Análisis de JCA y JCE Análisis de JCA y JCE (11/40)(11/40)

1. Asegurar un objeto con nuevos parámetros criptográficos1.4. Definición del generador de parámetros

AlgorithmParameterSpec parameter = null;

Class parameterType = IvParameterSpec.class;

AlgorithmParameterGenerator parameterGenerator = null;

try { parameterGenerator = AlgorithmParameterGenerator.getInstance("AES", providerName); }

catch (NoSuchAlgorithmException e) { e.printStackTrace(); return; }

catch (NoSuchProviderException e) { e.printStackTrace(); return; }

Page 37: Aplicaciones Criptográficas Java

Análisis de JCA y JCE Análisis de JCA y JCE (12/40)(12/40)

1. Asegurar un objeto con nuevos parámetros criptográficos1.5. Inicialización del generador de parámetros

genParameter = null; int parameterSize = 16;

if (genParameter != null && random == null) {

try { parameterGenerator.init(genParameter); }

catch (InvalidAlgorithmParameterException e) { e.printStackTrace(); return; }

} else if (genParameter != null && random != null) {

try { parameterGenerator.init(genParameter, random); }

catch (InvalidAlgorithmParameterException e) { e.printStackTrace(); return; }

} else if (genParameter == null && random == null) {

parameterGenerator.init(parameterSize);

} else if (genParameter == null && random != null) {

parameterGenerator.init(parameterSize, random);

}

Page 38: Aplicaciones Criptográficas Java

Análisis de JCA y JCE Análisis de JCA y JCE (13/40)(13/40)

1. Asegurar un objeto con nuevos parámetros criptográficos1.6. Generación del parámetro

AlgorithmParameters algorithmParameters = parameterGenerator.generateParameters();

try { parameter = algorithmParameters.getParameterSpec(parameterType); }

catch (InvalidParameterSpecException e) { e.printStackTrace(); return; }

Page 39: Aplicaciones Criptográficas Java

Análisis de JCA y JCE Análisis de JCA y JCE (14/40)(14/40)

1. Asegurar un objeto con nuevos parámetros criptográficos1.7. Definición del algoritmo de seguridad

Cipher secureAlgorithm = null;

try { secureAlgorithm = Cipher.getInstance("AES/CBC/PKCS7Padding", providerName); }

catch (NoSuchAlgorithmException e) { e.printStackTrace(); return; }

catch (NoSuchProviderException e) { e.printStackTrace(); return; }

catch (NoSuchPaddingException e) { e.printStackTrace(); return; }

Page 40: Aplicaciones Criptográficas Java

Análisis de JCA y JCE Análisis de JCA y JCE (15/40)(15/40)

1. Asegurar un objeto con nuevos parámetros criptográficos1.8. Inicialización del algoritmo de seguridad

int mode = Cipher.ENCRYPT_MODE;

if (parameter != null && random == null) {

try { secureAlgorithm.init(mode, key, parameter); }

catch (InvalidKeyException e) { e.printStackTrace(); return; }

catch (InvalidAlgorithmParameterException e) { e.printStackTrace(); return; }

} else if (parameter != null && random != null) {

try { secureAlgorithm.init(mode, key, parameter, random); }

catch (InvalidKeyException e) { e.printStackTrace(); return; }

catch (InvalidAlgorithmParameterException e) { e.printStackTrace(); return; }

} else if (parameter == null && random == null) {

try { secureAlgorithm.init(mode, key); }

catch (InvalidKeyException e) { e.printStackTrace(); return; }

} else if (parameter == null && random != null) {

try { secureAlgorithm.init(mode, key, random); }

catch (InvalidKeyException e) { e.printStackTrace(); return; }

}

Page 41: Aplicaciones Criptográficas Java

Análisis de JCA y JCE Análisis de JCA y JCE (16/40)(16/40)

1. Asegurar un objeto con nuevos parámetros criptográficos1.9. Obtención del parámetro que se haya podido generar automáticamente

try { algorithmParameters = secureAlgorithm.getParameters(); }

catch (Throwable throwable) {}

if (parameter == null && algorithmParameters != null) {

if (parameterType == null) {

parameterType = AlgorithmParameterSpec.class;

}

try { parameter = algorithmParameters.getParameterSpec(parameterType); }

catch (InvalidParameterSpecException e) { e.printStackTrace(); return; }

}

Page 42: Aplicaciones Criptográficas Java

Análisis de JCA y JCE Análisis de JCA y JCE (17/40)(17/40)

1. Asegurar un objeto con nuevos parámetros criptográficos1.10. Creación del objeto seguro

SealedObject secureObject = null;

try { secureObject = new SealedObject(object, secureAlgorithm); }

catch (IllegalBlockSizeException e) { e.printStackTrace(); return; }

catch (IOException e) { e.printStackTrace(); return; }

saveObject(secureObject);

Page 43: Aplicaciones Criptográficas Java

Análisis de JCA y JCE Análisis de JCA y JCE (18/40)(18/40)

2. Almacenar parámetros criptográficos para un uso posterior2.1. Traducción de la clave

encodedKey = key.getEncoded();

Page 44: Aplicaciones Criptográficas Java

Análisis de JCA y JCE Análisis de JCA y JCE (19/40)(19/40)

2. Almacenar parámetros criptográficos para un uso posterior2.2. Traducción del parámetro

if (parameter instanceof IvParameterSpec) {

IvParameterSpec iv = (IvParameterSpec)parameter;

encodedParameter = iv.getIV();

}

Page 45: Aplicaciones Criptográficas Java

Análisis de JCA y JCE Análisis de JCA y JCE (20/40)(20/40)

2. Almacenar parámetros criptográficos para un uso posterior2.3. Otra traducción del parámetro

AlgorithmParameters parameterTranslator = null;

try { parameterTranslator = AlgorithmParameters.getInstance("RIJNDAEL", providerName); }

catch (NoSuchAlgorithmException e) { e.printStackTrace(); return; }

catch (NoSuchProviderException e) { e.printStackTrace(); return; }

try { parameterTranslator.init(parameter); }

catch (InvalidParameterSpecException e) { e.printStackTrace(); return; }

try { encodedParameter = parameterTranslator.getEncoded(); }

catch (IOException e) { e.printStackTrace(); return; }

Page 46: Aplicaciones Criptográficas Java

Análisis de JCA y JCE Análisis de JCA y JCE (21/40)(21/40)

2. Almacenar parámetros criptográficos para un uso posterior2.4. Almacenamiento de los parámetros

saveKey(encodedKey);

saveParameter(encodedParameter);

Page 47: Aplicaciones Criptográficas Java

Análisis de JCA y JCE Análisis de JCA y JCE (22/40)(22/40)

3. Obtener el objeto asegurado utilizando los nuevos parámetros criptográficos3.1. Carga de los parámetros

encodedKey = loadKey();

encodedParameter = loadParameter();

Page 48: Aplicaciones Criptográficas Java

Análisis de JCA y JCE Análisis de JCA y JCE (23/40)(23/40)

3. Obtener el objeto asegurado utilizando los nuevos parámetros criptográficos3.2. Definición del algoritmo de seguridad

try { secureAlgorithm = Cipher.getInstance("AES/CBC/PKCS7Padding", providerName); }

catch (NoSuchAlgorithmException e) { e.printStackTrace(); return; }

catch (NoSuchProviderException e) { e.printStackTrace(); return; }

catch (NoSuchPaddingException e) { e.printStackTrace(); return; }

Page 49: Aplicaciones Criptográficas Java

Análisis de JCA y JCE Análisis de JCA y JCE (24/40)(24/40)

3. Obtener el objeto asegurado utilizando los nuevos parámetros criptográficos3.3. Traducción de los parámetros a la forma adecuada

key = new SecretKeySpec(encodedKey, "AES");

parameterType = IvParameterSpec.class; parameterTranslator = null;

try { parameterTranslator = AlgorithmParameters.getInstance("RIJNDAEL", providerName); }

catch (NoSuchAlgorithmException e) { e.printStackTrace(); return; }

catch (NoSuchProviderException e) { e.printStackTrace(); return; }

try { parameterTranslator.init(encodedParameter); }

catch (IOException e) { e.printStackTrace(); return; }

try { parameter = parameterTranslator.getParameterSpec(parameterType); }

catch (InvalidParameterSpecException e) { e.printStackTrace(); return; }

Page 50: Aplicaciones Criptográficas Java

Análisis de JCA y JCE Análisis de JCA y JCE (25/40)(25/40)

3. Obtener el objeto asegurado utilizando los nuevos parámetros criptográficos3.4. Inicialización del algoritmo de seguridad para desprotección

mode = Cipher.DECRYPT_MODE;

if (parameter != null && random == null) {

try { secureAlgorithm.init(mode, key, parameter); }

catch (InvalidKeyException e) { e.printStackTrace(); return; }

catch (InvalidAlgorithmParameterException e) { e.printStackTrace(); return; }

} else if (parameter != null && random != null) {

try { secureAlgorithm.init(mode, key, parameter, random); }

catch (InvalidKeyException e) { e.printStackTrace(); return; }

catch (InvalidAlgorithmParameterException e) { e.printStackTrace(); return; }

} else if (parameter == null && random == null) {

try { secureAlgorithm.init(mode, key); }

catch (InvalidKeyException e) { e.printStackTrace(); return; }

} else if (parameter == null && random != null) {

try { secureAlgorithm.init(mode, key, random); }

catch (InvalidKeyException e) { e.printStackTrace(); return; }

}

Page 51: Aplicaciones Criptográficas Java

Análisis de JCA y JCE Análisis de JCA y JCE (26/40)(26/40)

3. Obtener el objeto asegurado utilizando los nuevos parámetros criptográficos3.5. Obtención del objeto asegurado

try {

secureObject = (SealedObject)loadObject();

object = (String)secureObject.getObject(secureAlgorithm); }

catch (IllegalBlockSizeException e) { e.printStackTrace(); return; }

catch (BadPaddingException e) { e.printStackTrace(); return; }

catch (IOException e) { e.printStackTrace(); return; }

catch (ClassNotFoundException e) { e.printStackTrace(); return; }

Page 52: Aplicaciones Criptográficas Java

Análisis de JCA y JCE Análisis de JCA y JCE (27/40)(27/40)

4. Asegurar otro objeto reutilizando parámetros criptográficos ya existentes4.1. Definición del objeto y carga de los parámetros

String otherObject = "other object";

encodedKey = loadKey();

encodedParameter = loadParameter();

Page 53: Aplicaciones Criptográficas Java

Análisis de JCA y JCE Análisis de JCA y JCE (28/40)(28/40)

4. Asegurar otro objeto reutilizando parámetros criptográficos ya existentes4.2. Traducción de la clave a su forma adecuada

key = new SecretKeySpec(encodedKey, "AES");

Page 54: Aplicaciones Criptográficas Java

Análisis de JCA y JCE Análisis de JCA y JCE (29/40)(29/40)

4. Asegurar otro objeto reutilizando parámetros criptográficos ya existentes4.3. Traducción del parámetro a su forma adecuada

parameterType = IvParameterSpec.class; parameterTranslator = null;

try { parameterTranslator = AlgorithmParameters.getInstance("RIJNDAEL", providerName); }

catch (NoSuchAlgorithmException e) { e.printStackTrace(); return; }

catch (NoSuchProviderException e) { e.printStackTrace(); return; }

try { parameterTranslator.init(encodedParameter); }

catch (IOException e) { e.printStackTrace(); return; }

try { parameter = parameterTranslator.getParameterSpec(parameterType); }

catch (InvalidParameterSpecException e) { e.printStackTrace(); return; }

Page 55: Aplicaciones Criptográficas Java

Análisis de JCA y JCE Análisis de JCA y JCE (30/40)(30/40)

4. Asegurar otro objeto reutilizando parámetros criptográficos ya existentes4.4. Definición del algoritmo de seguridad

secureAlgorithm = null;

try { secureAlgorithm = Cipher.getInstance("AES/CBC/PKCS7Padding", providerName); }

catch (NoSuchAlgorithmException e) { e.printStackTrace(); return; }

catch (NoSuchProviderException e) { e.printStackTrace(); return; }

catch (NoSuchPaddingException e) { e.printStackTrace(); return; }

Page 56: Aplicaciones Criptográficas Java

Análisis de JCA y JCE Análisis de JCA y JCE (31/40)(31/40)

4. Asegurar otro objeto reutilizando parámetros criptográficos ya existentes4.5. Inicialización del algoritmo de seguridad para protección

mode = Cipher.ENCRYPT_MODE;

if (parameter != null && random == null) {

try { secureAlgorithm.init(mode, key, parameter); }

catch (InvalidKeyException e) { e.printStackTrace(); return; }

catch (InvalidAlgorithmParameterException e) { e.printStackTrace(); return; }

} else if (parameter != null && random != null) {

try { secureAlgorithm.init(mode, key, parameter, random); }

catch (InvalidKeyException e) { e.printStackTrace(); return; }

catch (InvalidAlgorithmParameterException e) { e.printStackTrace(); return; }

} else if (parameter == null && random == null) {

try { secureAlgorithm.init(mode, key); }

catch (InvalidKeyException e) { e.printStackTrace(); return; }

} else if (parameter == null && random != null) {

try { secureAlgorithm.init(mode, key, random); }

catch (InvalidKeyException e) { e.printStackTrace(); return; }

}

Page 57: Aplicaciones Criptográficas Java

Análisis de JCA y JCE Análisis de JCA y JCE (32/40)(32/40)

4. Asegurar otro objeto reutilizando parámetros criptográficos ya existentes4.6. Obtención del parámetro si fuera generado automáticamente

try { algorithmParameters = secureAlgorithm.getParameters(); }

catch (Throwable throwable) {}

if (parameter == null && algorithmParameters != null) {

if (parameterType == null) { parameterType = AlgorithmParameterSpec.class; }

try { parameter = algorithmParameters.getParameterSpec(parameterType); }

catch (InvalidParameterSpecException e) { e.printStackTrace(); return; }

}

Page 58: Aplicaciones Criptográficas Java

Análisis de JCA y JCE Análisis de JCA y JCE (33/40)(33/40)

4. Asegurar otro objeto reutilizando parámetros criptográficos ya existentes4.7. Creación del objeto seguro

SealedObject otherSecureObject = null;

try { otherSecureObject = new SealedObject(otherObject, secureAlgorithm); }

catch (IllegalBlockSizeException e) { e.printStackTrace(); return; }

catch (IOException e) { e.printStackTrace(); return; }

saveObject(otherSecureObject);

Page 59: Aplicaciones Criptográficas Java

Análisis de JCA y JCE Análisis de JCA y JCE (34/40)(34/40)

5. Obtener el objeto asegurado reutilizando parámetros criptográficos ya existentes5.1. Carga de los parámetros

encodedKey = loadKey();

encodedParameter = loadParameter();

Page 60: Aplicaciones Criptográficas Java

Análisis de JCA y JCE Análisis de JCA y JCE (35/40)(35/40)

5. Obtener el objeto asegurado reutilizando parámetros criptográficos ya existentes5.2. Definición del algoritmo de seguridad

try { secureAlgorithm = Cipher.getInstance("AES/CBC/PKCS7Padding", providerName); }

catch (NoSuchAlgorithmException e) { e.printStackTrace(); return; }

catch (NoSuchProviderException e) { e.printStackTrace(); return; }

catch (NoSuchPaddingException e) { e.printStackTrace(); return; }

Page 61: Aplicaciones Criptográficas Java

Análisis de JCA y JCE Análisis de JCA y JCE (36/40)(36/40)

5. Obtener el objeto asegurado reutilizando parámetros criptográficos ya existentes5.3. Traducción de la clave a su forma adecuada

key = new SecretKeySpec(encodedKey, "AES");

Page 62: Aplicaciones Criptográficas Java

Análisis de JCA y JCE Análisis de JCA y JCE (37/40)(37/40)

5. Obtener el objeto asegurado reutilizando parámetros criptográficos ya existentes5.4. Traducción del parámetro a su forma adecuada

parameterType = IvParameterSpec.class; parameterTranslator = null;

try { parameterTranslator = AlgorithmParameters.getInstance("RIJNDAEL", providerName); }

catch (NoSuchAlgorithmException e) { e.printStackTrace(); return; }

catch (NoSuchProviderException e) { e.printStackTrace(); return; }

try { parameterTranslator.init(encodedParameter); }

catch (IOException e) { e.printStackTrace(); return; }

try { parameter = parameterTranslator.getParameterSpec(parameterType); }

catch (InvalidParameterSpecException e) { e.printStackTrace(); return; }

Page 63: Aplicaciones Criptográficas Java

Análisis de JCA y JCE Análisis de JCA y JCE (38/40)(38/40)

5. Obtener el objeto asegurado reutilizando parámetros criptográficos ya existentes5.5. Inicialización del algoritmo de seguridad para desprotección

mode = Cipher.DECRYPT_MODE;

if (parameter != null && random == null) {

try { secureAlgorithm.init(mode, key, parameter); }

catch (InvalidKeyException e) { e.printStackTrace(); return; }

catch (InvalidAlgorithmParameterException e) { e.printStackTrace(); return; }

} else if (parameter != null && random != null) {

try { secureAlgorithm.init(mode, key, parameter, random); }

catch (InvalidKeyException e) { e.printStackTrace(); return; }

catch (InvalidAlgorithmParameterException e) { e.printStackTrace(); return; }

} else if (parameter == null && random == null) {

try { secureAlgorithm.init(mode, key); }

catch (InvalidKeyException e) { e.printStackTrace(); return; }

} else if (parameter == null && random != null) {

try { secureAlgorithm.init(mode, key, random); }

catch (InvalidKeyException e) { e.printStackTrace(); return; }

}

Page 64: Aplicaciones Criptográficas Java

Análisis de JCA y JCE Análisis de JCA y JCE (39/40)(39/40)

5. Obtener el objeto asegurado reutilizando parámetros criptográficos ya existentes5.6. Obtención del objeto asegurado

try {

otherSecureObject = (SealedObject)loadObject();

object = (String)otherSecureObject.getObject(secureAlgorithm); }

catch (IllegalBlockSizeException e) { e.printStackTrace(); return; }

catch (BadPaddingException e) {e.printStackTrace(); return; }

catch (IOException e) { e.printStackTrace(); return; }

catch (ClassNotFoundException e) { e.printStackTrace(); return; }

}

Page 65: Aplicaciones Criptográficas Java

Análisis de JCA y JCE Análisis de JCA y JCE (40/40)(40/40)

Deficiencias JCA y JCE

–Difícil uso y aprendizaje.–Mucho conocimiento técnico exigido.–Más líneas de código de las necesarias.–Gran esfuerzo en tiempo exigido.–Gran dedicación por usuario.–Muy compleja para usuarios inexpertos.

Page 66: Aplicaciones Criptográficas Java

El proyecto

Valor añadido de JCEF

Page 67: Aplicaciones Criptográficas Java

Valor añadido de JCEF Valor añadido de JCEF (1/7)(1/7)

1. Asegurar un objeto con nuevos parámetros criptográficos

2. Almacenar parámetros criptográficos para un uso posterior

3. Obtener el objeto asegurado utilizando los nuevos parámetros criptográficos

4. Asegurar otro objeto reutilizando parámetros criptográficos ya existentes

5. Obtener el objeto asegurado reutilizando parámetros criptográficos ya existentes

Page 68: Aplicaciones Criptográficas Java

Valor añadido de JCEF Valor añadido de JCEF (2/7)(2/7)

1. Asegurar un objeto con nuevos parámetros criptográficos

try {

// 1. Se desea asegurar un objeto

// 1.1. Definimos un objeto que se desea asegurar

String object = "my object";

// 1.2. Se selecciona un algoritmo de seguridad

SymmetricProtection secureAlgorithm = new AES_BlockSymmetricProtectionRREXKY();

// 1.3. Se inicializa el algoritmo con parámetros concretos si fuera necesario (esta inicialización es opcional)

// Esta inicialización es inexistente ya que se desea utilizar unos parámetros nuevos (clave y parámetro generado automáticamente por el algoritmo)

// 1.4. Se asegura el objeto y se guarda en algún lugar

SecureObject secureObject = new SecureObject(object, secureAlgorithm);

saveObject(secureObject);

// ...

Page 69: Aplicaciones Criptográficas Java

Valor añadido de JCEF Valor añadido de JCEF (3/7)(3/7)

2. Almacenar parámetros criptográficos para un uso posterior

// 2. Se guardan los parámetros para su posterior uso, ya sea para generar nuevos objetos seguros u obtener objetos asegurados (objetos inseguros) que es lo más habitual

byte[] encodedKey = secureAlgorithm.getSymmetricKey().getEncoded();

byte[] encodedParameter = secureAlgorithm.getEncodedParameter();

saveKey(encodedKey); saveParameter(encodedParameter);

// ...

Page 70: Aplicaciones Criptográficas Java

Valor añadido de JCEF Valor añadido de JCEF (4/7)(4/7)

3. Obtener el objeto asegurado utilizando los nuevos parámetros criptográficos

// ... tiempo más tarde en algún otro lugar del código ...

// 3. Se desea recuperar el objeto de forma segura

// 3.1. Cargamos los datos que se necesitan

encodedKey = loadKey(); encodedParameter = loadParameter();

// 3.2. Inicializamos el algoritmo con los parámetros apropiados para poder obtener el objeto asegurado

secureAlgorithm = new AES_BlockSymmetricProtectionRREXKY();

secureAlgorithm.setSymmetricKey(encodedKey);

secureAlgorithm.setParameter(encodedParameter);

// 3.3. Se obtiene el objeto asegurado a partir de su versión en forma de objeto seguro

secureObject = (SecureObject)loadObject();

object = (String)secureObject.getObject(secureAlgorithm);

// ...

Page 71: Aplicaciones Criptográficas Java

Valor añadido de JCEF Valor añadido de JCEF (5/7)(5/7)

4. Asegurar otro objeto reutilizando parámetros criptográficos ya existentes

// ... tiempo más tarde en algún otro lugar del código ...

// 4. Se desea asegurar un nuevo objeto con la misma clave y parámetro en un instante de tiempo posterior

// 4.1. Se define el nuevo objeto

String otherObject = "other object";

// 4.2. Se cargan los parámetros que se necesitan

encodedKey = loadKey(); encodedParameter = loadParameter();

// 4.3. Se inicializa el algoritmo

secureAlgorithm = new AES_BlockSymmetricProtectionRREXKY();

secureAlgorithm.setSymmetricKey(encodedKey);

secureAlgorithm.setParameter(encodedParameter);

// 4.4. Se asegura el nuevo objeto

SecureObject otherSecureObject = new SecureObject(otherObject, secureAlgorithm);

saveObject(otherSecureObject);

// ...

Page 72: Aplicaciones Criptográficas Java

Valor añadido de JCEF Valor añadido de JCEF (6/7)(6/7)

5. Obtener el objeto asegurado reutilizando parámetros criptográficos ya existentes

// ... tiempo más tarde en algún otro lugar del código ...

// 5. Se desea recuperar el nuevo objeto asegurado

// 5.1. Cargamos los datos que se necesitan

encodedKey = loadKey(); encodedParameter = loadParameter();

// 5.2. Inicializamos el algoritmo con los parámetros apropiados para poder obtener el objeto asegurado

secureAlgorithm = new AES_BlockSymmetricProtectionRREXKY();

secureAlgorithm.setSymmetricKey(encodedKey);

secureAlgorithm.setParameter(encodedParameter);

// 5.3. Se obtiene el objeto asegurado a partir de su versión en forma de objeto seguro

otherSecureObject = (SecureObject)loadObject();

object = (String)otherSecureObject.getObject(secureAlgorithm);

}

catch (Throwable throwable) { throwable.printStackTrace(); return; }

Page 73: Aplicaciones Criptográficas Java

Valor añadido de JCEF Valor añadido de JCEF (7/7)(7/7)

Mejoras de JCEF

–Fácil de utilizar.–Sencillo y rápido aprendizaje.–Posibilidad de mejora.–Fácil definición de nuevos algoritmos criptográficos–64 algoritmos de todo tipo.–Sencillo para usuarios inexpertos y expertos.–Objetos seguros para cualquier algoritmo criptográfico

Page 74: Aplicaciones Criptográficas Java

El proyecto

Detalles y curiosidades

Page 75: Aplicaciones Criptográficas Java

Detalles y curiosidades Detalles y curiosidades (1/7)(1/7)

Estructura y composición del proyecto

Page 76: Aplicaciones Criptográficas Java

Detalles y curiosidades Detalles y curiosidades (2/7)(2/7)

Pruebas realizadas– Todos los métodos de todas las clases.– Pruebas de lectura y escritura de

propiedades.– Pruebas de funcionalidad sobre los

algoritmos.

Page 77: Aplicaciones Criptográficas Java

Detalles y curiosidades Detalles y curiosidades (3/7)(3/7)

Metodología

Page 78: Aplicaciones Criptográficas Java

Detalles y curiosidades Detalles y curiosidades (4/7)(4/7)

Coste del proyecto– Coste económico: CERO EUROS– Coste de tiempo: entre 2000 y 3000 horas.– Complejidad:

Page 79: Aplicaciones Criptográficas Java

Detalles y curiosidades Detalles y curiosidades (5/7)(5/7)

Page 80: Aplicaciones Criptográficas Java

Detalles y curiosidades Detalles y curiosidades (6/7)(6/7)

Disponibilidadhttp://jcef.sourceforge.net

Page 81: Aplicaciones Criptográficas Java

Detalles y curiosidades Detalles y curiosidades (7/7)(7/7)

Recursos utilizados

ArgoUML

WinSCP FileZilla

Mozilla Firefox

Page 82: Aplicaciones Criptográficas Java

El proyecto

Futuros proyectos

Page 83: Aplicaciones Criptográficas Java

Futuros proyectos Futuros proyectos (1/7)(1/7)

Ampliaciones de JCEF

Page 84: Aplicaciones Criptográficas Java

Futuros proyectos Futuros proyectos (2/7)(2/7)

Pruebas sobre algoritmos JCEF

Page 85: Aplicaciones Criptográficas Java

Futuros proyectos Futuros proyectos (3/7)(3/7)

Certificados digitales con JCEF

Page 86: Aplicaciones Criptográficas Java

Futuros proyectos Futuros proyectos (4/7)(4/7)

Archivos seguros con JCEF

Page 87: Aplicaciones Criptográficas Java

Futuros proyectos Futuros proyectos (5/7)(5/7)

Proveedor Criptográfico JCEF

Page 88: Aplicaciones Criptográficas Java

Futuros proyectos Futuros proyectos (6/7)(6/7)

Almacén de objetos seguros con JCEF

Page 89: Aplicaciones Criptográficas Java

Futuros proyectos Futuros proyectos (7/7)(7/7)

Metaimplementación de “Aplicaciones Criptográficas Java”

Page 90: Aplicaciones Criptográficas Java

El proyecto

Conclusiones

Page 91: Aplicaciones Criptográficas Java

Conclusiones Conclusiones (1/3)(1/3)

Puntos débiles:1. Tiempo empleado superior a 300 horas.2. No haber desarrollado exactamente lo que

estaba previsto desde un principio.

Page 92: Aplicaciones Criptográficas Java

Conclusiones Conclusiones (2/3)(2/3)

Puntos fuertes:1. Haber desarrollado un trabajo novedoso2. Aguantar un año de trabajo.3. Diseño de imágenes4. Sección “Preguntas frecuentes”.5. Sección “Futuros proyectos”.6. Publicación del proyecto en una página web.7. El uso 100% de herramientas Open Source,

Freeware y gratuitas.8. Conocimiento aplicado: Ingeniería del software,

gráficos, programación, ofimática, diseño web,...

Page 93: Aplicaciones Criptográficas Java

http://jcef.sourceforge.net

Page 94: Aplicaciones Criptográficas Java

Aplicaciones Criptográficas Aplicaciones Criptográficas JavaJava

Proyecto Fin de Carrera

Facultad de Informática

Universidad de Las Palmas de Gran Canaria

Autor: Jesús María Ramos Saky

Tutor: Miguel Ángel Pérez Aguiar24/05/06

http://jcef.sourceforge.net