1 / 94

Aplicaciones Criptográficas Java

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

tale
Download Presentation

Aplicaciones Criptográficas Java

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


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

  2. Breve descripción (1/4)

  3. Breve descripción (2/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).

  4. Breve descripción (3/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.

  5. Breve descripción (4/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);

  6. Introducción Introducción a la seguridad

  7. Introducción a la seguridad (1/9) • La seguridad es muy importante hoy día

  8. Introducción a la seguridad (2/9) • Evitar que se obtengan documentos de forma ilegal.

  9. Introducción a la seguridad (3/9) • Evitar que se obtenga información sobre los comunicantes.

  10. Introducción a la seguridad (4/9) • Evitar que se pueda suplantar una identidad

  11. Introducción a la seguridad (5/9) • Evitar que se puedan repetir mensajes sin ser detectada tal repetición

  12. Introducción a la seguridad (6/9) • Evitar la modificación de mensajes antes de llegar a su destinatario

  13. Introducción a la seguridad (7/9) • Evitar la interrupción de sus servicios

  14. Introducción a la seguridad (8/9) • Los servicios de seguridad solucionan o previenen los ataques

  15. Introducción a la seguridad (9/9) • Y para implementar estos servicios, se utiliza principalmente la Criptografía.

  16. Introducción Criptografía Orientada a Objetos

  17. Criptografía OO (1/8) • La Criptografía es una herramienta que permite: • Asegurar objetos. • Y recuperar objetos asegurados.

  18. Criptografía OO (2/8) • La Criptografía gestiona objetos seguros: • Protegidos y/o Autentificables

  19. Criptografía OO (3/8)

  20. Criptografía OO (4/8)

  21. Criptografía OO (5/8)

  22. Criptografía OO (6/8) Es auténtico sólo si la huella de éste objeto es la misma que la adjunta

  23. Criptografía OO (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

  24. Criptografía OO (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.

  25. Introducción Análisis de JCA y JCE

  26. Análisis de JCA y JCE (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

  27. Análisis de JCA y JCE (2/40) • Asegurar un objeto con nuevos parámetros criptográficos • Almacenar parámetros criptográficos para un uso posterior • Obtener el objeto asegurado utilizando los nuevos parámetros criptográficos • Asegurar otro objeto reutilizando parámetros criptográficos ya existentes • Obtener el objeto asegurado reutilizando parámetros criptográficos ya existentes

  28. Análisis de JCA y JCE (3/40) 1. Asegurar un objeto con nuevos parámetros criptográficos 1.1. Definición del objeto a asegurar y carga del proveedor 1.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áticamente 1.10. Creación del objeto seguro

  29. Análisis de JCA y JCE (4/40) 2. Almacenar parámetros criptográficos para un uso posterior 2.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

  30. Análisis de JCA y JCE (5/40) 3. Obtener el objeto asegurado utilizando los nuevos parámetros criptográficos 3.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

  31. Análisis de JCA y JCE (6/40) 4. Asegurar otro objeto reutilizando parámetros criptográficos ya existentes 4.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

  32. Análisis de JCA y JCE (7/40) 5. Obtener el objeto asegurado reutilizando parámetros criptográficos ya existentes 5.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

  33. Análisis de JCA y JCE (8/40) 1. Asegurar un objeto con nuevos parámetros criptográficos 1.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();

  34. Análisis de JCA y JCE (9/40) 1. Asegurar un objeto con nuevos parámetros criptográficos 1.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; }

  35. Análisis de JCA y JCE (10/40) 1. Asegurar un objeto con nuevos parámetros criptográficos 1.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();

  36. Análisis de JCA y JCE (11/40) 1. Asegurar un objeto con nuevos parámetros criptográficos 1.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; }

  37. Análisis de JCA y JCE (12/40) 1. Asegurar un objeto con nuevos parámetros criptográficos 1.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); }

  38. Análisis de JCA y JCE (13/40) 1. Asegurar un objeto con nuevos parámetros criptográficos 1.6. Generación del parámetro AlgorithmParameters algorithmParameters = parameterGenerator.generateParameters(); try { parameter = algorithmParameters.getParameterSpec(parameterType); } catch (InvalidParameterSpecException e) { e.printStackTrace(); return; }

  39. Análisis de JCA y JCE (14/40) 1. Asegurar un objeto con nuevos parámetros criptográficos 1.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; }

  40. Análisis de JCA y JCE (15/40) 1. Asegurar un objeto con nuevos parámetros criptográficos 1.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; } }

  41. Análisis de JCA y JCE (16/40) 1. Asegurar un objeto con nuevos parámetros criptográficos 1.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; } }

  42. Análisis de JCA y JCE (17/40) 1. Asegurar un objeto con nuevos parámetros criptográficos 1.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);

  43. Análisis de JCA y JCE (18/40) 2. Almacenar parámetros criptográficos para un uso posterior 2.1. Traducción de la clave encodedKey = key.getEncoded();

  44. Análisis de JCA y JCE (19/40) 2. Almacenar parámetros criptográficos para un uso posterior 2.2. Traducción del parámetro if (parameter instanceof IvParameterSpec) { IvParameterSpec iv = (IvParameterSpec)parameter; encodedParameter = iv.getIV(); }

  45. Análisis de JCA y JCE (20/40) 2. Almacenar parámetros criptográficos para un uso posterior 2.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; }

  46. Análisis de JCA y JCE (21/40) 2. Almacenar parámetros criptográficos para un uso posterior 2.4. Almacenamiento de los parámetros saveKey(encodedKey); saveParameter(encodedParameter);

  47. Análisis de JCA y JCE (22/40) 3. Obtener el objeto asegurado utilizando los nuevos parámetros criptográficos 3.1. Carga de los parámetros encodedKey = loadKey(); encodedParameter = loadParameter();

  48. Análisis de JCA y JCE (23/40) 3. Obtener el objeto asegurado utilizando los nuevos parámetros criptográficos 3.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; }

  49. Análisis de JCA y JCE (24/40) 3. Obtener el objeto asegurado utilizando los nuevos parámetros criptográficos 3.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; }

  50. Análisis de JCA y JCE (25/40) 3. Obtener el objeto asegurado utilizando los nuevos parámetros criptográficos 3.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; } }

More Related