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
Top Related