Cifrado Simétrico PDF
Document Details
Uploaded by Deleted User
Tags
Summary
Este documento explica el cifrado simétrico, un método fundamental en criptografía. Se analiza su funcionamiento, ventajas y desventajas como la gestión de claves.
Full Transcript
Cifrado Simétrico El cifrado simétrico es uno de los enfoques más fundamentales para la seguridad de los datos en la criptografía. En este sistema, tanto el remitente como el receptor utilizan la misma clave secreta para cifrar y descifrar la información. El cifrado simétrico es...
Cifrado Simétrico El cifrado simétrico es uno de los enfoques más fundamentales para la seguridad de los datos en la criptografía. En este sistema, tanto el remitente como el receptor utilizan la misma clave secreta para cifrar y descifrar la información. El cifrado simétrico es eficiente en cuanto a velocidad, lo que lo hace ideal para grandes volúmenes de datos. A continuación, te explicaré en detalle los conceptos, tipos, ejemplos y características del cifrado simétrico. Cifrado simétrico Pros Cons Gestión de Alta velocidad claves Eficiente para Vulnerabilidad grandes a ataques volúmenes Sencillez en la No escalable clave ¿Qué es el cifrado simétrico? El cifrado simétrico es un tipo de criptografía en el que una única clave se utiliza tanto para cifrar como para descifrar los datos. Es decir, el mismo secreto que transforma el texto claro en un texto cifrado es también el que permite convertir el texto cifrado de vuelta a su forma original. ¿Qué método de cifrado utilizar? Cifrado simétrico Cifrado asimétrico Utiliza la misma clave para Utiliza un par de claves cifrar y descifrar. Rápido y (pública y privada). Más eficiente para grandes seguro, pero más lento y volúmenes de datos. adecuado para pequeñas cantidades de datos. Clave Única Texto Claro Secreto Compartido Datos Originales Seguridad de la Clave Información Sensible Cifrado Proceso de Desencriptación Simétrico Texto Cifrado Uso de la Misma Clave Datos Incomprensibles Restauración de Datos Protección de Información Proceso básico de cifrado simétrico: 1. Cifrado: El remitente aplica un algoritmo de cifrado simétrico junto con una clave secreta para transformar el texto plano (información legible) en texto cifrado (información ilegible). Fórmula simplificada: C = E(M, K) Donde: C es el texto cifrado. E es el algoritmo de cifrado. M es el mensaje o texto claro. K es la clave secreta compartida. 2. Descifrado: El receptor aplica el algoritmo de descifrado simétrico con la misma clave secreta para transformar el texto cifrado de nuevo en texto claro. Fórmula simplificada: M = D(C, K) Donde: M es el mensaje o texto claro. D es el algoritmo de descifrado. C es el texto cifrado. K es la misma clave utilizada en el cifrado. Proceso de Cifrado Seguridad de Datos Proceso de Descifrado Características principales del cifrado simétrico 1. Clave única: Tanto el emisor como el receptor utilizan la misma clave para cifrar y descifrar la información. Es fundamental que esta clave permanezca en secreto. 2. Rapidez: Los algoritmos de cifrado simétrico son rápidos y eficientes, lo que los hace adecuados para cifrar grandes volúmenes de datos. 3. Seguridad dependiente de la clave: La seguridad del sistema depende completamente de la confidencialidad de la clave. Si un atacante obtiene la clave, puede descifrar todos los mensajes cifrados con ella. 4. Distribución de la clave: Uno de los mayores retos en el cifrado simétrico es el intercambio seguro de claves. Ambas partes deben asegurarse de que la clave se comparta de manera segura y que no sea interceptada. Características del cifrado simétrico Implementación fácil Clave única Rapidez Bajo impacto en la Alto impacto en la seguridad seguridad Seguridad de la Distribución de clave la clave Implementación difícil Cifrado por Procesa en Bloques bloques fijos Cifrado Simétrico Procesa de Cifrado por manera Flujo continua Tipos de algoritmos de cifrado simétrico Existen dos tipos principales de cifrado simétrico basados en cómo procesan los datos: cifrado por bloques y cifrado por flujo. División en bloques Uso de padding 64 bits Último bloque más pequeño Cifrado por 128 bits Relleno para ajuste bloques 1. Cifrado por bloques: En este tipo de cifrado, los datos se dividen en bloques de tamaño fijo (por ejemplo, 64 bits o 128 bits), y cada bloque se cifra por separado usando la clave secreta. Si el último bloque es más pequeño que el tamaño del bloque, se utiliza padding (relleno) para ajustarlo. Ejemplos populares de cifrado por bloques: DES (Data Encryption Standard): AES Utiliza bloques de 64 bits y una clave de 56 bits. Aunque fue ampliamente DES utilizado en el pasado, hoy en día se considera inseguro debido a la corta Tamaño longitud de su clave, lo que lo hace vulnerable a ataques de bruta. de fuerza Bloque: 128 bits Tamaño de Bloque: 64 bits AES (Advanced Encryption Standard): Algoritmos Longitud de Clave: 128/192/256 Longitud de Clave: 56 AES bitses uno de los algoritmos más seguros y ampliamente utilizados hoy en día. de Cifrado bits Utiliza bloques de 128 bits y puede manejar claves de 128, 192 o 256 bits, lo que Seguridad: Inseguro Simétrico lo hace muy resistente a ataques de fuerza bruta. Es el Seguridad: Muy estándar actual paraSeguro el Uso: Histórico cifrado simétrico y se utiliza en muchas aplicaciones, como comunicaciones Uso: Ampliamente Utilizado seguras, almacenamiento en la nube, etc. 3DES (Triple DES): Es una variante del DES que aplica 3DESel algoritmo tres veces para cada bloque con tres claves diferentes, lo que mejora su seguridad. Sin embargo, debido a su menor eficiencia, ha sido reemplazado Tamaño de porBloque: AES en la64 mayoría bits de los casos. Longitud de Clave: 168 bits (3 claves) Seguridad: Mejorada Uso: Menos Común Proceso de Cifrado por Flujo Transmisión Generación 2. Cifrado por flujo: de Operación en Tiempo Flujo En lugar de de cifrarClave XOR los datos en bloques, el cifrado por flujo cifra Real los datos bit a bit o byte a byte. Un generador de clave produce una secuencia de bits (llamada flujo de clave), que se combina con el texto plano, generalmente mediante una operación XOR, para producir el texto cifrado. Este tipo de cifrado es adecuado para transmitir datos en tiempo real, como en las comunicaciones por radio o streaming de video, ya que puede cifrar cada bit a medida que se transmite. Entrada de Salida Cifrada Texto Plano Uso Problemas de Seguridad SSL (Capa de Sockets Seguros) Inseguridad RC4 (Rivest WEP (Privacidad Equivalente por Obsolescencia Cipher 4) Cable) Ejemplo de cifrado por flujo: RC4 (Rivest Cipher 4): Estado Actual Es un algoritmo de cifrado por flujo ampliamente utilizado en el pasado, especialmente en protocolos como SSL (Secure Socket Layer) y WEP (Wired Obsoleto Equivalent Privacy). Sin embargo, RC4 ha demostrado ser inseguro y está Alternativas obsoleto en la mayoría de las aplicaciones Modernas modernas. Modos de operación de los algoritmos de cifrado por bloques Cuando usamos cifrado por bloques, los modos de operación determinan cómo se cifran los bloques de datos. Algunos de los modos más comunes son: 1. ECB (Electronic Codebook): En este modo, cada bloque de datos se cifra por separado. Aunque es simple, tiene una grave desventaja: si dos bloques del texto plano son iguales, los bloques cifrados también serán idénticos, lo que puede permitir que un atacante encuentre patrones en los datos. Por esta razón, ECB no se recomienda para la mayoría de los usos. 2. CBC (Cipher Block Chaining): En el modo CBC, cada bloque de texto claro se combina (mediante XOR) con el bloque de texto cifrado anterior antes de ser cifrado. El primer bloque se combina con un valor especial llamado vector de inicialización (IV). Esto evita que bloques iguales produzcan el mismo cifrado, mejorando la seguridad. ECB CBC Implementación en Java: Cifra cada bloque por separado Combina el bloque actual con el java Los bloques de texto plano texto cifrado anterior idénticos producen texto cifrado Usa un vector de inicialización (IV) idéntico Copiar código import javax.crypto.Cipher; para el primer bloque No recomendado para la mayoría import javax.crypto.spec.IvParameterSpec; Modos de Previene bloques de texto cifrado de los usos byte[] ivBytes = obtenerIVAleatorio(); operación idénticos // Debe ser seguro y aleatorio para IvParameterSpec ivSpec = new IvParameterSpec(ivBytes); CTR cifrados por Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");CFB/OFB* bloques cipher.init(Cipher.ENCRYPT_MODE, secretKey, ivSpec); Usa un contadorbyte[] cambiante textoCifrado = cipher.doFinal(datos); CFB convierte a cifrado por flujo Combina el contador con el texto Consideraciones: OFB también convierte a cifrado plano usando XOR El IV se puede enviar en texto claro, pero debe estar protegido contra manipulación (e.g., usando una firma o MAC). por flujo Permite cifrado y descifrado en No Reutilizar Claves e IVs: Evitar usar la misma combinaciónPermite cifrado continuo de datos para múltiples paralelo mensajes. 1. CFB (Cipher Feedback) y OFB (Output Feedback): Ambos son modos que convierten un cifrado por bloques en un cifrado por flujo, permitiendo cifrar datos de manera continua, sin tener que esperar a llenar un bloque completo. 2. CTR (Counter Mode): En este modo, se usa un contador que cambia para cada bloque. El contador se cifra y luego se combina con el texto claro mediante XOR. Esto convierte el cifrado por bloques en un cifrado por flujo y es muy eficiente, ya que permite cifrar y descifrar bloques de manera paralela. Cifrado Simétrico Rápido y eficiente, pero requiere gestión segura de claves. Cifrado Asimétrico ¿Qué método de cifrado utilizar? Seguro para el intercambio de claves, pero más lento. Ventajas del cifrado simétrico: 1. Eficiencia: El cifrado simétrico es mucho más rápido que el cifrado Sistema asimétrico, lo que Híbrido lo hace adecuado para cifrar grandes cantidades de datos o para aplicaciones que requieren alto rendimiento. Combina lo mejor de ambos 2. Menor consumo de recursos: Comparado con el cifrado métodos, pero asimétrico, más el cifrado complejo. simétrico requiere menos poder computacional y recursos. Desventajas del cifrado simétrico: 1. Distribución de claves: El principal inconveniente es cómo compartir de manera segura la clave entre las partes. Si un atacante intercepta la clave, puede descifrar todos los mensajes. 2. Escalabilidad: A medida que aumenta el número de participantes que necesitan comunicarse de manera segura, el número de claves a gestionar también crece rápidamente. Si tienes 100 personas que quieren comunicarse de manera segura entre sí, necesitarías 4950 claves diferentes. Conclusión El cifrado simétrico es una técnica eficiente y rápida que se utiliza ampliamente en aplicaciones donde el rendimiento es clave, como el cifrado de discos y las comunicaciones en redes. Sin embargo, su principal desafío es la distribución y gestión segura de las claves. Por eso, en muchos casos, el cifrado simétrico se combina con el cifrado asimétrico en sistemas híbridos, donde el cifrado asimétrico se utiliza para intercambiar las claves simétricas de forma segura. Cifrado Asimétrico Clave Pública Clave Privada No Requiere Cifrado Compartir Clave Asimétrico Secreta Seguridad Basada en 3. Sistemas de Cifrado Asimétrico Problemas Matemáticos 3.1. Definición y Características del Cifrado Asimétrico Más Lento que El cifrado asimétrico, también conocido como criptografía de clave pública, utiliza un par de el Cifrado claves relacionadas matemáticamente: Simétrico Clave Pública: Puede ser distribuida abiertamente y se utiliza para cifrar datos o verificar firmas. Clave Privada: Debe mantenerse en secreto y se utiliza para descifrar datos o generar firmas. Características: No Requiere Compartir Clave Secreta: Facilita la distribución de claves. Seguridad Basada en Problemas Matemáticos: Como la factorización de números grandes o el logaritmo discreto. Más Lento que el Cifrado Simétrico: Debido a operaciones matemáticas más complejas. Cifrado Asimétrico Firmas Relación Digitales Matemática Clave privada para Asegura que la clave firmar, clave pública pública no revele la para verificar. clave privada. Proceso de Cifrado Utiliza la clave pública para cifrar, la clave privada para descifrar. 3.2. Claves Públicas y Privadas Relación Matemática: Las claves están vinculadas de manera que conocer la clave pública no permite deducir la clave privada (si se utilizan claves de tamaño adecuado). Uso en Cifrado: Cifrar: Se utiliza la clave pública del destinatario. Descifrar: Solo puede hacerlo el destinatario con su clave privada. Uso en Firmas Digitales: Firmar: El remitente utiliza su clave privada. Verificar: Cualquier persona puede verificar la firma usando la clave pública del remitente. Implementación Consideraciones Importaciones de Java Tamaño de Clave Generación Generador de Clave Almacenamiento Seguro de Clave Generación de Clave RSA en Java 3.3. Algoritmo RSA Componentes El algoritmo RSA es uno de los sistemas Clave más utilizados y se basa en la de cifrado asimétrico dificultad de factorizar números grandes. Clave Pública 3.3.1. Fundamentos Matemáticos de RSA Clave Privada Selección de Números Primos Grandes: Se eligen dos números primos, p y q. Cálculo de n : n = p * q ; n es el módulo utilizado en las operaciones. Cálculo de φ(n) : φ(n) = (p - 1) * (q - 1). Elección del Exponente Público e : Un número entero que cumple 1 < e < φ(n) y es coprimo con φ(n). Cálculo del Exponente Privado d : Tal que d ≡ e⁻¹ mod φ(n). Par de Claves: Clave Pública: (e, n) Clave Privada: (d, n) 3.3.2. Generación de Claves RSA Implementación en Java: java import java.security.KeyPairGenerator; import java.security.KeyPair; import java.security.PrivateKey; import java.security.PublicKey; KeyPairGenerator keyPairGen = KeyPairGenerator.getInstance("RSA"); keyPairGen.initialize(2048); // Tamaño de clave de 2048 bits KeyPair keyPair = keyPairGen.generateKeyPair(); Proceso PublicKey publicKey =de Cifrado y Descifrado RSA keyPair.getPublic(); PrivateKey privateKey = keyPair.getPrivate(); Consideraciones: Tamaño de Clave Adecuado: Se recomiendan claves de al menos 2048 bits Identificar para una seguridad razonable. Mensaje Cifrar Mensaje Almacenamiento Seguro: La clave privada debe protegerse adecuadamente. Generar Texto Cifrado Descifrar Texto Determinar la Cifrado Implementar en representación Aplicar la Java Nota numérica del fórmula de Obtener la Limitaciones mensaje cifrado para salida cifrada Usar la fórmula convertir el del proceso de de descifrado Escribir código mensaje cifrado para recuperar Java para Reconocer las el mensaje realizar el limitaciones en original cifrado RSA el tamaño de los datos debido a la longitud de la clave 3.3.3. Cifrado RSA Directo Proceso de Cifrado: Cifrar: c = m^e mod n , donde m es el mensaje (como número) y c es el texto cifrado. Descifrar: m = c^d mod n. Implementación en Java: java import javax.crypto.Cipher; Cipher cipher = Cipher.getInstance("RSA/ECB/PKCS1Padding"); cipher.init(Cipher.ENCRYPT_MODE, publicKey); byte[] textoCifrado = cipher.doFinal(datos); Limitaciones: Tamaño Máximo de Datos: Limitado por el tamaño de la clave y el relleno (padding). Fórmula: longitud_datos ≤ (tamaño_clave_en_bits / 8) - 11 Ejemplo: Con clave de 2048 bits, máximo 245 bytes. Descifrar Generar Cifrar Clave Enviar Datos Descifrar Cifrar Datos Clave Clave Simétrica Cifrados y Datos con con Clave Simétrica Simétrica con Clave Clave Clave Simétrica con Clave Aleatoria Pública RSA Simétrica Simétrica Privada RSA ¿Qué método de cifrado utilizar para proteger datos sensibles? 3.3.4. Limitaciones y Soluciones Cifrado Inviabilidad para Datos Grandes: Asimétrico Cifrado Simétrico RSA es ineficiente y limitado Mayorpara cifrar grandes seguridad, pero Cifrado Híbrido volúmenes de datos. El proceso Rápido es para y eficiente más lento. computacionalmente costoso y lento. Combina eficiencia del datos Solución: grandes. cifrado simétrico con seguridad del Cifrado Híbrido: Combinar cifrado simétrico y asimétrico. asimétrico. 3.3.5. Cifrado RSA con Clave Envuelta (Key Wrapping) Concepto: Se genera una clave simétrica aleatoria para cifrar los datos. La clave simétrica se cifra con la clave pública RSA del destinatario. Se envían los datos cifrados y la clave simétrica cifrada. Ventajas: Eficiencia: El cifrado simétrico es rápido para datos grandes. Seguridad: La clave simétrica está protegida mediante cifrado asimétrico. Implementación en Java: java // Generar clave simétrica KeyGenerator keyGen = KeyGenerator.getInstance("AES"); keyGen.init(256); SecretKey secretKey = keyGen.generateKey(); // Cifrar datos con AES Cipher cipherAES = Cipher.getInstance("AES/CBC/PKCS5Padding"); cipherAES.init(Cipher.ENCRYPT_MODE, secretKey, ivSpec); byte[] datosCifrados = cipherAES.doFinal(datos); // Cifrar clave simétrica con RSA Cipher cipherRSA = Cipher.getInstance("RSA/ECB/PKCS1Padding"); cipherRSA.init(Cipher.WRAP_MODE, publicKey); byte[] claveCifrada = cipherRSA.wrap(secretKey); // Enviar datosCifrados y claveCifrada Desempaquetado (Unwrapping) de la Clave Simétrica: java Copiar código // Descifrar clave simétrica Cipher cipherRSA = Cipher.getInstance("RSA/ECB/PKCS1Padding"); cipherRSA.init(Cipher.UNWRAP_MODE, privateKey); SecretKey secretKey = (SecretKey) cipherRSA.unwrap(claveCifrada, "AES", Cipher.SECRET_KEY); // Descifrar datos Firmas Digitales Cipher cipherAES = Cipher.getInstance("AES/CBC/PKCS5Padding"); cipherAES.init(Cipher.DECRYPT_MODE, secretKey, ivSpec); byte[] datosDescifrados = cipherAES.doFinal(datosCifrados); Consideraciones: Gestionar el IV: El receptor necesita el mismo IV para descifrar. Integridad de Datos: Considerar el uso de HMAC para garantizar la integridad. Integridad de los No Repudio Datos Evita que el remitente Asegura que el pueda negar que el contenido no ha sido mensaje fue enviado, alterado durante la proporcionando transmisión o evidencia legal. almacenamiento. Autenticación del Remitente Verifica la identidad del remitente del mensaje para prevenir suplantaciones. 4. Firma Digital Las firmas digitales proporcionan una forma de asegurar la autenticidad y la integridad de un mensaje o documento digital. 4.1. Necesidad de las Firmas Digitales 4.1.1. Integridad de los Datos Objetivo: Asegurar que el contenido no ha sido alterado durante la transmisión o almacenamiento. Importancia: Detectar modificaciones no autorizadas o errores. 4.1.2. Autenticación del Remitente Proceso de Firma Digital Objetivo: Verificar la identidad del remitente del mensaje. Importancia: Prevenir suplantaciones y garantizar que el mensaje proviene de una Adjuntar la fuente confiable. Firma del Hash Firma 4.1.3. No Repudio El acto de cifrar el hash El paso de enviar el con una clave privada mensaje original junto Objetivo: Evitarpara quecrear el remitente una firma pueda negar posteriormente haber enviado el con la firma digital. mensaje. digital. Verificación de la Cálculo del Hash Firma El proceso de crear un El proceso de utilizar hash de tamaño fijo a una clave pública para partir de un mensaje verificar la autenticidad utilizando funciones de la firma. criptográficas. Importancia: Proporcionar evidencia en disputas legales o contractuales. Proceso de Creación de Firma Digital Importar Clase Signature 4.2. Funcionamiento de la Firma Inicializar Digital Obtener Datos Las firmas digitales utilizan criptografía asimétrica y funciones hash. Objeto Actualizar Signature Firma con Importar4.2.1. la Proceso de Firma Digital Generar Firma Datos clase de 1. CálculoRecuperar del Hash dellos Mensaje: Digital seguridad de datos Se aplicaque Configurar una función hash el (e.g., SHA-256) al mensaje para obtener criptográfica Java necesaria necesitan un resumen desertamaño objeto fijo. Proporcionar firmados. para firmas2. Firma del Hash: Signature con los datos al Crear la firma digitales. El remitente cifra el hashlacon clave privada su clave privada, objeto creando la firma digital.digital a partir 3. Adjuntar la Firma al Mensaje: para firmar. Signature para de los datos La firma se envía junto con el mensaje original.su actualizados. procesamiento. 4.2.2. Proceso de Verificación de la Firma 1. Recibir el Mensaje y la Firma. 2. Cálculo del Hash del Mensaje Recibido: El receptor aplica la misma función hash al mensaje recibido. 3. Descifrar la Firma: Utiliza la clave pública del remitente para descifrar la firma, obteniendo el hash original. 4. Comparación de Hashes: Si ambos hashes coinciden, la firma es válida y se asegura la integridad y autenticidad. 4.3. Implementación de Firmas Digitales en Java 4.3.1. Clase java.security.Signature La clase Signature proporciona funcionalidades para generar y verificar firmas digitales. Funciones del Certificado Digital 4.3.2. Generación de una Firma Digital RSA Implementación: Genera confianza de Facilitación de la terceros en la java Confianza autenticidad Asegura Copiar código que la clave Verificación de pertenece a una import java.security.Signature; Identidad entidad // Datos específica a firmar byte[] datos = obtenerDatos(); // Inicializar objeto Signature para firmar Documento central Certificado Signature signature = Signature.getInstance("SHA256withRSA"); que vincula identidad signature.initSign(privateKey); Digital y clave // Proporcionar los datos a firmar signature.update(datos); // Generar la firma byte[] firmaDigital = signature.sign(); Consideraciones: Algoritmo: "SHA256withRSA" combina la función hash SHA-256 y RSA para la firma. Clave Privada: Necesaria para firmar, debe mantenerse segura. Componentes de un Certificado Digital Sujeto Versión Detalles sobre el La versión específica propietario del del estándar X.509 4.3.3. Validación certificado, de una Firma Digital RSA incluyendo utilizada. Implementación: DN. Periodojava de Número de Validez Serie Copiar código El periodo durante el java.security.Signature; import Un identificador único cual el certificado es asignado por la // Datos recibidos y firma digital Autoridad de válido. byte[] datos = obtenerDatos(); Certificación. Algoritmo de Emisor Firma Información sobre la El algoritmo utilizado CA que emitió el por la CA para firmar certificado. el certificado. byte[] firmaDigital = obtenerFirma(); // Inicializar objeto Signature para verificar Signature signature = Signature.getInstance("SHA256withRSA"); signature.initVerify(publicKey); // Proporcionar los datos originales signature.update(datos); // Verificar la firma boolean esValida = signature.verify(firmaDigital); Consideraciones: Clave Pública del Remitente: Necesaria para verificar la firma. Resultado: esValida será true si la firma es auténtica y los datos no han sido alterados. 4.4. Certificados Digitales 4.4.1. ¿Qué es un Certificado Digital? Un certificado digital es un documento electrónico que asocia una clave pública con la identidad de su propietario. Está emitido y firmado por una Autoridad de Certificación (CA) de confianza. Funciones: Verificación de Identidad: Certificados Asegura que una clave pública pertenece a una persona u Digitales organización específica. Certificados Facilita la Confianza: Permite aEmitidos terceros confiar por unaen la autenticidad de la clave pública. CA Certificados emitidos por una Autoridad de Certificación tras verificar la identidad del Roles de la Certificados solicitante. Autoridad de Autosignados Certificación Certificados donde el Roles que implican la emisor y el sujeto son la verificación de misma entidad, identidades, emisión de utilizados en entornos certificados, revocación internos de confianza. y mantenimiento de listas de revocación. 4.4.2. Componentes de un Certificado X.509 El estándar X.509 define el formato de los certificados digitales. Componentes clave: Version: Versión del estándar X.509 utilizada. Serial Number: Número único asignado por la CA. Signature Algorithm: Algoritmo utilizado por la CA para firmar el certificado. Issuer: Información sobre la CA que emitió el certificado. Validity Period: Periodo de validez (fecha de inicio y expiración). Subject: Información sobre el propietario del certificado. Distinguished Name (DN): Incluye atributos como: CN: Common Name (Nombre común, e.g., nombre de dominio). O: Organization (Organización). OU: Organizational Unit (Unidad organizativa). L: Localidad. ST: Estado o provincia. C: País. Subject Public Key Info: Clave pública del sujeto y algoritmo asociado. Extensions: Información adicional opcional (e.g., uso de clave, restricciones). Signature: Firma digital de la CA sobre el certificado. 4.4.3. Emisión de Certificados Autosignados: Características: El sujeto y el emisor son la misma entidad. Uso: Entornos de desarrollo, pruebas o confianza interna. Limitaciones: No son reconocidos por navegadores o sistemas externos sin agregar la clave pública manualmente. Certificados Emitidos por una CA: Proceso: 1. Generar un Par de Claves: El solicitante genera su clave pública y privada. 2. Crear una Solicitud de Firma de Certificado (CSR): Contiene la clave pública y la información del solicitante. Se firma digitalmente con la clave privada del solicitante. 3. Enviar la CSR a la CA: La CA verifica la identidad del solicitante. 4. Emisión del Certificado: La CA firma el certificado y se lo entrega al solicitante. Autoridad de Certificación (CA): Roles: Verificar identidades. Emitir y revocar certificados. Mantener listas de certificados revocados (CRLs). Ejemplos de CAs Conocidas: Let's Encrypt DigiCert Comodo 5. Gestión de Claves 5.1. Importancia de la Gestión Segura de Claves Confidencialidad: Las claves privadas y simétricas deben mantenerse secretas. Integridad: Las claves no deben ser alteradas sin autorización. Disponibilidad: Las claves deben estar disponibles para los procesos autorizados cuando sea necesario. Rotación de Claves: Cambiar claves periódicamente para limitar el impacto en caso de compromiso. 5.2. Distribución y Almacenamiento de Claves Distribución Segura de Claves Asimétricas: La clave pública puede distribuirse abiertamente. La clave privada nunca debe compartirse. Distribución de Claves Simétricas: Debe realizarse mediante canales seguros. Uso de cifrado asimétrico para intercambiar claves simétricas (e.g., Key Wrapping). Almacenamiento Seguro: Utilizar almacenes de claves protegidos con contraseña. Limitar el acceso físico y lógico a los sistemas donde se almacenan las claves. 5.3. Herramienta keytool de Java keytool es una utilidad de línea de comandos incluida en el JDK que permite gestionar: Almacenes de Claves (Keystores): Almacenan claves privadas, certificados y cadenas de certificados. Almacenes de Confianza (Truststores): Almacenan certificados de CA y claves públicas en las que se confía. Comandos Comunes: Generar un Par de Claves y un Certificado Autosignado: bash Copiar código keytool -genkeypair -alias miAlias -keyalg RSA -keysize 2048 -keystore miKeystore.jks -storepass miContraseña -validity 365 Importar un Certificado en un Keystore: bash Copiar código keytool -importcert -alias aliasCertificado -file certificado.crt -keystore miKeystore.jks -storepass miContraseña Listar el Contenido de un Keystore: bash Copiar código keytool -list -keystore miKeystore.jks -storepass miContraseña Exportar un Certificado: bash Copiar código keytool -exportcert -alias miAlias -file miCertificado.crt -keystore miKeystore.jks -storepass miContraseña 5.4. Acceso a Almacenes de Claves desde Java 5.4.1. Clase java.security.KeyStore La clase KeyStore permite cargar y manejar almacenes de claves en aplicaciones Java. Cargar un Keystore: java Copiar código import java.security.KeyStore; import java.io.FileInputStream; KeyStore keystore = KeyStore.getInstance("JKS"); try (FileInputStream fis = new FileInputStream("miKeystore.jks")) { keystore.load(fis, "miContraseña".toCharArray()); } Obtener una Clave Privada: java Copiar código PrivateKey privateKey = (PrivateKey) keystore.getKey("miAlias", "contraseñaClave".toCharArray()); Obtener un Certificado Público: java Copiar código Certificate cert = keystore.getCertificate("miAlias"); PublicKey publicKey = cert.getPublicKey(); Crear un KeyStore en Memoria: java Copiar código KeyStore keystore = KeyStore.getInstance("JKS"); keystore.load(null, null); // Crear un keystore vacío Almacenar el KeyStore: java Copiar código try (FileOutputStream fos = new FileOutputStream("miNuevoKeystore.jks")) { keystore.store(fos, "miContraseña".toCharArray()); } 6. Aplicaciones Java Seguras en Internet 6.1. Seguridad en la Plataforma Java 6.1.1. El Bytecode y la JVM Bytecode: Código intermedio generado por el compilador Java. Independiente de la plataforma. JVM (Java Virtual Machine): Interpreta y ejecuta el bytecode. Proporciona un entorno seguro mediante: Verificador de Bytecode: Comprueba la validez del código. Gestión de Memoria: A través del recolector de basura (Garbage Collector). Control de Accesos: Mediante el Security Manager. 6.1.2. El Gestor de Seguridad (Security Manager) Función: Controla las operaciones que una aplicación Java puede realizar. Restringe acciones potencialmente peligrosas. Activación: Puede activarse al iniciar la JVM: bash Copiar código Estableciendo Conexiones Seguras SSL/TLS TrustStore java -Djava.security.manager MiAplicacion SSLSocket O programáticamente en el código Java: Contiene certificados Facilita la comunicación CA de confianza segura cliente-servidor java Copiar código System.setSecurityManager(new SecurityManager()); Ejemplos de Restricciones: Acceso al sistema de archivos. KeyStore Operaciones de red. SSLContext Acceso a variables de entorno y propiedades del sistema. Almacena claves de nuevos procesos. Configura los privadas deCreación forma parámetros de segura SSL/TLS 6.1.3. Asignación de Permisos y Ficheros de Políticas Ficheros de Políticas (.policy ): Definen los permisos otorgados a las aplicaciones. Crear Configurar Sintaxis basada en permisos, objetivos y acciones. SSLSocketFactory Estructura de un Fichero de Políticas: SSLContext java Crear Cargar Cargar Crear Crear Inicializar Crear Copiar código SSLSocket Keystore Truststore KeyManager TrustManager SSLContext grant codeBase "file:/ruta/de/aplicacion/" { permission java.io.FilePermission SSLSocketFactory "/ruta/de/archivo", "read,write"; permission java.net.SocketPermission "host:puerto", "connect,accept"; }; Tipos de Permisos Comunes: Iniciar java.io.FilePermission : Handshake Controla acceso a archivos y directorios. Acciones: read , write , delete , execute. java.net.SocketPermission : Enviar Datos Recibir Controla conexiones de red. Datos Acciones: connect , accept , listen , resolve. java.util.PropertyPermission : Controla acceso a propiedades del sistema. Acciones: read , write. Herramienta PolicyTool: Proporciona una interfaz gráfica para editar ficheros de políticas. Facilita la gestión de permisos y evita errores de sintaxis. 6.2. Conexiones Seguras 6.2.1. Negociación SSL/TLS SSL/TLS: Protocolos criptográficos que proporcionan comunicaciones seguras en una red. TLS (Transport Layer Security) es el sucesor de SSL (Secure Sockets Layer). Proceso de Negociación (Handshake): 1. Inicio de Conexión: El cliente se conecta al servidor y envía una lista de protocolos y cifrados soportados. 2. Selección de Parámetros: El servidor selecciona el protocolo y cifrado a utilizar. 3. Intercambio de Certificados: El servidor envía su certificado al cliente para autenticación. 4. Verificación del Certificado: El cliente verifica la validez y autenticidad del certificado del servidor. 5. Generación de Claves de Sesión: Se establece una clave simétrica para cifrar la comunicación. ¿Qué tipo Usar tipos primitivos 6. Finalización del Handshake: Comienza la comunicación cifrada con las claves de dato acordadas. Menor consumo de utilizar en Objetivos: memoria y mejor rendimiento. Java?Confidencialidad: Cifrado de datos. Usar String Integridad: Uso de MACs (Message Authentication Codes). Mayor flexibilidad y Autenticación: Verificación de identidades mediante certificados. facilidad de uso. 6.2.2. Conexiones SSL con Java Clases Principales: SSLSocket y SSLServerSocket : Para conexiones cliente-servidor. SSLContext : Configura los parámetros de SSL/TLS. Ejemplo de Cliente SSL: java Copiar código import javax.net.ssl.SSLSocketFactory; import javax.net.ssl.SSLSocket; SSLSocketFactory sslSocketFactory = (SSLSocketFactory) SSLSocketFactory.getDefault(); try (SSLSocket sslSocket = (SSLSocket) sslSocketFactory.createSocket("servidor.com", 443)) { sslSocket.startHandshake(); // Enviar y recibir datos InputStream input = sslSocket.getInputStream(); OutputStream output = sslSocket.getOutputStream(); // Comunicación segura } Configuración de SSLContext : java Copiar código import javax.net.ssl.SSLContext; import java.security.KeyStore; Manejo Eficiente de Cadenas en Java import javax.net.ssl.TrustManagerFactory; import javax.net.ssl.KeyManagerFactory; // Cargar keystore con claves privadas Fugas de KeyStore keyStore = KeyStore.getInstance("JKS"); Memoria keyStore.load(new StringBuilder Problemas Manipulación de FileInputStream("keystore.jks"),"contraseñaKeystore".toCharArray()); derivados de la // Cargar truststore con certificados de CA cadenas más retención KeyStore trustStore = KeyStore.getInstance("JKS"); rápida y no innecesaria de trustStore.load(new FileInputStream("truststore.jks"), segura para hilos referencias "contraseñaTruststore".toCharArray()); // Crear KeyManager y TrustManager KeyManagerFactory kmf = KeyManagerFactory.getInstance("SunX509"); kmf.init(keyStore, "contraseñaClaves".toCharArray()); Recolección de TrustManagerFactory tmf = TrustManagerFactory.getInstance("SunX509"); Basuratmf.init(trustStore); StringBuffer // Inicializar SSLContext Gestión SSLContext sslContext = SSLContext.getInstance("TLS"); Manipulación de automática de sslContext.init(kmf.getKeyManagers(), tmf.getTrustManagers(), new cadenas segura memoria en q1+ ºSecureRandom()); para hilos pero Java // Crear SSLSocketFactory más lenta SSLSocketFactory sslSocketFactory = sslContext.getSocketFactory(); Consideraciones: Eficiencia de Certificados Válidos: Asegurar que los certificados son válidos y confiables. Memoria Protocolos y Cifrados Seguros: Deshabilitar protocolos obsoletos (e.g., SSLv3) y cifrados débiles. Uso eficiente de la memoria en Verificación de Servidor y Cliente: Opcionalmente, implementar autenticación mutua. operaciones de cadenas Conceptos de Programación en Java Expresiones Notación Infija Booleanas Evalúa a Utilizada para verdadero o falso, expresiones guiando las aritméticas con guiando las aritméticas con estructuras de operadores entre control operandos Datos Sucios Buenas Prácticas Datos No Validados Validación de Entradas Calidad de Errores Potenciales Manejo de Excepciones Datos y Datos Maliciosos Buenas Prevención de Inyección de Prácticas Código 7. Conceptos Adicionales 7.1. Tipos de Datos en Java Tipos Primitivos: byte : 8 bits short : 16 bits int : 32 bits long : 64 bits float : 32 bits en coma flotante double : 64 bits en coma flotante Gestión de la Pila de Ejecución y Flujo char : 16 bits Unicode boolean : 1 bit (representado internamente) Cadenas de Texto ( String ): Llamada a Método Objetos inmutables. Secuencias de caracteres Unicode. Creación de Se almacenan en el heap. Marco de Pila Almacenamiento de Variables Locales Almacenamiento de Dirección de Retorno Gestión del Flujo de Control Riesgo de Desbordamiento de Pila 7.2. Manipulación de Cadenas y Gestión de Memoria StringBuilder y StringBuffer : Clases utilizadas para construir y modificar cadenas de manera eficiente. StringBuilder : No es seguro para hilos, pero es más rápido. StringBuffer : Seguro para hilos, pero ligeramente más lento. Uso Eficiente de la Memoria: Método de Detección de Errores Concatenación con + : Cálculo del Valor Verificación de la Cada operación crea un nuevo objeto String. de Integridad de los Ineficiente en bucles o múltiples concatenaciones. Comprobación Datos Recomendación: Utilizar InvolucraStringBuilder calcular un Asegura que para operaciones los datos de cadenas. intensivas valor para verificar la permanezcan sin integridad de los datos. alteraciones durante la java transmisión. Copiar código StringBuilder sb = new StringBuilder(); Seguridad No Definición for (String s : lista) { sb.append(s); } Criptográfica String resultado = sb.toString(); Destaca la falta de Describe el método para Gestión de detectar errores en los Memoria: seguridad criptográfica. datos. Garbage Collector: Libera memoria de objetos sin referencias. Memory Leaks: Pueden ocurrir si se mantienen referencias innecesarias. Entendiendo los Sistemas Binario y Hexadecimal Proceso de Conversión Sistema Binario Transforma datos Representa datos en binarios en formato base 2 utilizando bits hexadecimal 7.3. Notaciones y Expresiones en Programación Notación Infija: Operadores entre operandos. Ejemplo: a + b , x * y. Expresiones Booleanas: Sistema Evaluaciones que resultan en true o false. Hexadecimal Utilizadas en estructuras de control (e.g., if , while ). Representa datos de manera compacta en base 16 utilizando dígitos y letras 7.4. Validación y Manejo de Errores Datos Sucios: Datos que no han sido validados y pueden contener errores o ser maliciosos. Buenas Prácticas: Validación de Entradas: Verificar tipo, rango y formato. Manejo de Excepciones: Capturar y manejar errores de forma controlada. Evitar Inyección de Código: Sanitizar entradas para prevenir ataques. 7.5. La Pila y el Flujo de Ejecución Pila de Ejecución (Stack): Almacena marcos de pila para cada método llamado. Contiene variables locales y direcciones de retorno. Flujo de Ejecución: Controlado por llamadas a métodos y estructuras de control. El desbordamiento de pila puede ocurrir en recursiones sin condición de salida. 7.6. Código de Redundancia Cíclica (CRC) Definición: Método para detectar errores en datos transmitidos o almacenados. Calcula un valor de comprobación a partir de los datos. Uso: Verificar la integridad de datos en comunicaciones. No proporciona seguridad criptográfica.