Aplicaciones Criptográficas Java

Post on 09-Jan-2016

40 views 2 download

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

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

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

• 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)

• 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)

• 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)

Introducción

Introducción a la seguridad

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

La seguridad es muy importante hoy día

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

Evitar que se obtengan documentos de forma ilegal.

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

Evitar que se obtenga información sobre los comunicantes.

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

Evitar que se pueda suplantar una identidad

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

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

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

Evitar la interrupción de sus servicios

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

Los servicios de seguridad solucionan o previenen los ataques

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.

Introducción

Criptografía Orientada a Objetos

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

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

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

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

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

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

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

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

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

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.

Introducción

Análisis de JCA y JCE

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

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

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

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

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

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

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

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

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; }

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

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; }

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);

}

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; }

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; }

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; }

}

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; }

}

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);

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

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

}

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; }

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);

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

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; }

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; }

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; }

}

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; }

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

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");

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; }

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; }

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; }

}

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; }

}

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);

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

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; }

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");

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; }

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; }

}

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; }

}

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.

El proyecto

Valor añadido de JCEF

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

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);

// ...

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);

// ...

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);

// ...

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);

// ...

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; }

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

El proyecto

Detalles y curiosidades

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

Estructura y composición del proyecto

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.

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

Metodología

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:

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

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

Disponibilidadhttp://jcef.sourceforge.net

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

Recursos utilizados

ArgoUML

WinSCP FileZilla

Mozilla Firefox

El proyecto

Futuros proyectos

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

Ampliaciones de JCEF

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

Pruebas sobre algoritmos JCEF

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

Certificados digitales con JCEF

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

Archivos seguros con JCEF

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

Proveedor Criptográfico JCEF

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

Almacén de objetos seguros con JCEF

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

Metaimplementación de “Aplicaciones Criptográficas Java”

El proyecto

Conclusiones

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.

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,...

http://jcef.sourceforge.net

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