Criptografía en Java PDF
Document Details
Uploaded by FineLookingRainforest
Tags
Summary
Este documento proporciona una guía sobre la gestión de seguridad en aplicaciones Java utilizando el Security Manager. Explica el uso de comandos, argumentos de sistema, como -Djava.security.manager, y las opciones adicionales dentro de la JVM. Además, ofrece información sobre cómo se activa el mecanismo de seguridad, las políticas de seguridad, y la ejecución controlada de las aplicaciones Java.
Full Transcript
java -Djava.security.manager=NombreGestor [otrasOpciones] nombreAplicación es una instrucción para ejecutar una aplicación Java especificando un gestor de seguridad (security manager) personalizado. Aquí tienes el desglose: 1. java: Es el comando para ejecutar la Máquina Virtual de Java (JVM) y l...
java -Djava.security.manager=NombreGestor [otrasOpciones] nombreAplicación es una instrucción para ejecutar una aplicación Java especificando un gestor de seguridad (security manager) personalizado. Aquí tienes el desglose: 1. java: Es el comando para ejecutar la Máquina Virtual de Java (JVM) y lanzar aplicaciones Java. 2. -Djava.security.manager=NombreGestor: Este es un argumento de sistema que configura el gestor de seguridad para la JVM. Vamos a desglosarlo: -D: Especifica una propiedad del sistema de Java en tiempo de ejecución. java.security.manager: Es una propiedad estándar que habilita y define un gestor de seguridad para la JVM. Este gestor supervisa las acciones que pueden realizar las aplicaciones, como leer/escribir archivos, conectarse a redes, o ejecutar código nativo. NombreGestor: El nombre de la clase que implementa un gestor de seguridad personalizado (por ejemplo, com.miempresa.MiSecurityManager). Si no se especifica un gestor personalizado, se usará el predeterminado (SecurityManager). 3. [otrasOpciones]: Son opciones adicionales que se pasan a la JVM. Ejemplos: -Xmx1024m: Establece el tamaño máximo de memoria para el heap. -classpath: Define el classpath para localizar clases y recursos. 4. nombreAplicación: El nombre de la clase principal o archivo JAR que se ejecutará. Ejemplo: Si la clase principal es Main, se usaría Main. Si es un JAR, podría ser algo como miAplicacion.jar. Ejemplo completo: bash Copiar código java -Djava.security.manager=com.miempresa.MiSecurityManager -Xmx512m - classpath./lib/ miAplicacion -Djava.security.manager=com.miempresa.MiSecurityManager: Usa una clase personalizada llamada MiSecurityManager como gestor de seguridad. -Xmx512m: Limita el uso máximo de memoria a 512 MB. -classpath./lib/: Especifica el directorio lib como classpath. miAplicacion: Ejecuta la clase principal miAplicacion. ¿Qué hace el gestor de seguridad? El gestor de seguridad (SecurityManager) establece políticas para restringir o permitir acciones específicas en el programa. Por ejemplo: Bloquear acceso a archivos en directorios restringidos. Impedir conexiones de red a ciertos dominios. Restringir la ejecución de código nativo o scripts maliciosos. Esto es especialmente útil en aplicaciones que ejecutan código no confiable, como applets, servidores de aplicaciones o entornos de sandbox. Notas importantes: 1. Uso moderno: El SecurityManager está en desuso desde Java 17 y podría eliminarse en versiones futuras. Se recomienda usar alternativas como controles de permisos específicos o configuraciones de contenedores. 2. Política de seguridad (java.security.policy): Para configurarlo, a menudo se usa un archivo de políticas con permisos detallados: bash Copiar código java -Djava.security.manager -Djava.security.policy=mipolitica.policy nombreAplicación -Djava.security.policy=mipolitica.policy Indica a la JVM que utilice un archivo de política específico (mipolitica.policy) para definir los permisos de la aplicación. El archivo mipolitica.policy debe ser una ruta válida (relativa o absoluta). Este archivo contiene reglas que definen qué operaciones están permitidas, como leer archivos, conectarse a redes, o ejecutar comandos externos. Por defecto, Java utiliza un archivo de política global definido por el sistema. Con este argumento, estás indicando que se use un archivo personalizado. ¿Qué sucede al ejecutar este comando? 1. Activación del gestor de seguridad: o Todas las acciones sensibles serán supervisadas. o Si la aplicación intenta realizar una acción no permitida (por ejemplo, escribir un archivo sin permiso), se lanzará una excepción AccessControlException. 2. Aplicación de la política: o Solo se permitirán las operaciones especificadas en mipolitica.policy. 3. Ejecución controlada: o La aplicación se ejecutará con restricciones, lo que aumenta la seguridad, especialmente útil en entornos donde se ejecuta código no confiable. Acciones posibles: read, write, execute, delete Grant{ //Permite lectura y escritura de cualquier fichero del sistema Permission java.io.FilePermission “”, “read, write”; //Permite conexión a cualquier host y port Permission java.net.SocketPermission “*:1024-“, “connect, resolve”; //Permite la lectura de propiedades del sistema Permission java.util.PorpertyPermission “*”, “read”; ¿Qué es un Socket? Un socket es un concepto fundamental en la programación de redes que permite la comunicación entre diferentes procesos, ya sea en la misma máquina o en máquinas diferentes a través de una red. En términos simples, un socket es un punto final en una comunicación bidireccional entre dos programas que se ejecutan en la red. Este documento explora la definición, funcionamiento y tipos de sockets, así como su importancia en el desarrollo de aplicaciones de red. Definición de Socket Un socket se puede definir como una combinación de una dirección IP y un número de puerto. La dirección IP identifica de manera única a un dispositivo en la red, mientras que el número de puerto especifica un servicio o aplicación en ese dispositivo. Juntos, estos elementos permiten que los datos se envíen y reciban entre diferentes aplicaciones. Funcionamiento de los Sockets Los sockets funcionan mediante el uso de protocolos de comunicación, siendo los más comunes TCP (Transmission Control Protocol) y UDP (User Datagram Protocol). TCP: Proporciona una conexión orientada a la conexión, lo que significa que establece una conexión confiable entre el cliente y el servidor antes de que se envíen los datos. Esto asegura que los datos lleguen en el orden correcto y sin pérdidas. UDP: Es un protocolo sin conexión que permite el envío de datagramas sin establecer una conexión previa. Esto lo hace más rápido, pero menos confiable, ya que no garantiza la entrega de los datos. Tipos de Sockets Existen varios tipos de sockets, entre los que destacan: 1. Sockets de flujo (Stream Sockets): Utilizan TCP y son ideales para aplicaciones que requieren una comunicación confiable y ordenada, como la transferencia de archivos o la navegación web. 2. Sockets de datagrama (Datagram Sockets): Utilizan UDP y son adecuados para aplicaciones que pueden tolerar la pérdida de datos, como el streaming de video o juegos en línea. 3. Sockets de dominio Unix: Permiten la comunicación entre procesos en la misma máquina y son más eficientes que los sockets de red. Importancia de los Sockets Los sockets son cruciales para el desarrollo de aplicaciones de red, ya que permiten la comunicación entre diferentes sistemas y dispositivos. Son utilizados en una amplia variedad de aplicaciones, desde navegadores web y servidores de correo electrónico hasta aplicaciones de mensajería instantánea y videojuegos en línea. La comprensión de los sockets es esencial para cualquier desarrollador que desee crear aplicaciones que se comuniquen a través de redes. Tipos más habituales de permisos - Java.net.SocketPermission - Java.net.PropertyPermission (una propiedad es una pareja ; acciones posibles: read, write) Acciones posibles : - Accept - Connect - Listen - Resolve El comando que has mencionado se refiere a la herramienta jarsigner, que es una utilidad de Java para firmar archivos JAR (Java ARchive) o para verificar su firma. Este comando se utiliza comúnmente para asegurar la autenticidad e integridad del contenido de un archivo JAR antes de su distribución. Estructura básica del comando jarsigner [opciones] nombre_biblioteca alias_almacen_claves 1. jarsigner: Es el ejecutable que se utiliza para firmar o verificar un archivo JAR. Viene incluido en el JDK. 2. [opciones]: Son argumentos adicionales que controlan el comportamiento del comando, como la ruta del almacén de claves, el tipo de almacén, contraseñas, etc. 3. nombre_biblioteca: Es el archivo JAR que deseas firmar o verificar. Debes proporcionar la ruta al archivo, por ejemplo, mi-aplicacion.jar. 4. alias_almacen_claves: Es el alias del certificado que se usará para firmar el archivo JAR. Este alias debe existir en el almacén de claves (keystore) que contiene el certificado digital y la clave privada asociada. Ejemplo práctico de uso Firmar un archivo JAR Supongamos que tienes un archivo JAR llamado mi-aplicacion.jar, un almacén de claves llamado mi-keystore.jks, y un alias para la clave llamado mi-certificado. jarsigner -keystore mi-keystore.jks -storepass miContrasena mi-aplicacion.jar mi-certificado -keystore: Especifica el archivo del almacén de claves (en este caso, mi- keystore.jks). -storepass: Contraseña del almacén de claves. mi-aplicacion.jar: El archivo JAR que estás firmando. mi-certificado: Alias del certificado que se utilizará para firmar. Verificar un archivo JAR Para verificar si un archivo JAR ya está firmado y si la firma es válida, puedes usar: bash Copiar código jarsigner -verify mi-aplicacion.jar Esto muestra información sobre la validez de la firma. Opciones comunes -keystore : Especifica el almacén de claves que contiene los certificados. -storepass : Contraseña para acceder al almacén de claves. -keypass : Contraseña para acceder a la clave privada. -sigalg : Algoritmo de firma, como SHA256withRSA. -digestalg : Algoritmo de resumen, como SHA-256. -tsa : URL de una Autoridad de Sellado de Tiempo (Time Stamping Authority) para añadir un sello de tiempo a la firma. -verify : verifica que la librería ha sido firmada ¿Por qué usar jarsigner? Firmar un archivo JAR asegura a los usuarios que el archivo proviene de una fuente confiable (el titular del certificado) y que no ha sido alterado desde que fue firmado. Es esencial en aplicaciones Java distribuidas públicamente o en entornos donde se requiere confianza. C:\jarsigner -keystore almacen_claves -signedjar output.jar input.jar clave 1. C:\jarsigner: Es la ruta al ejecutable jarsigner. En este caso, está ubicado en el disco C:. En sistemas con Java instalado, jarsigner suele estar en el directorio bin del JDK. 2. -keystore almacen_claves: Especifica la ruta o nombre del almacén de claves (keystore). Este archivo contiene los certificados digitales y las claves privadas necesarias para firmar archivos JAR. Por ejemplo: o Si tienes un archivo keystore llamado mi-keystore.jks, reemplazarías almacen_claves por su ruta. 3. -signedjar output.jar: Indica el nombre del archivo JAR firmado que se generará. Aquí, el archivo firmado se llamará output.jar. Este será el resultado del proceso de firma. 4. input.jar: Es el archivo JAR original que deseas firmar. Este archivo no se modifica directamente, ya que el comando genera una nueva versión firmada. 5. clave: Es el alias dentro del almacén de claves que identifica el certificado y la clave privada utilizados para la firma. Cada alias corresponde a un par clave/certificado en el keystore. Conexiones seguras Gestión personalizada de la información criptográfica – Inspección de la identidad en los extremos SSLSession, que se obtiene con el método getSession() de la clase SSLSocket. Métodos de la clase SSLSession: - String getCipherSuite(): para ver el algoritmo usado por java para proteger los datos, como resultado de la negociación SSL - Certificate[] getPeerCertificate(): para obtener el certificado que nos ha enviado el otro extremo - Principal getPeerPrincipal(): obtiene el DN dentro del subject del certificado del otro extremo - String getPeerHost(): obtiene el nombre del equipo con quien se intercambian los mensajes