Utilización de técnicas de programación segura ================================================ Introducción ----------------------------------------------------- En general, cuando se envía algo a través de sockets se envía como "texto plano", es decir, no sabemos si hay alguien usando un sniffer en la red y por tanto no sabemos si alguien está capturando los datos. En general, cualquier sistema que pretenda ser seguro necesitará usar cifrado. Prácticas de programación segura. ---------------------------------------------------- Para enviar mensajes cifrados se necesita algún mecanismo o algoritmo para convertir un texto normal en uno más difícil de comprender. El esquema general de todos los métodos es tener código como el siguiente: .. code-block:: java public String cifrar (String texto, String clave) { } public String descifrar(String texto,String clave) { } Método César ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Si el alfabeto es el siguiente: ABCDEFGHIJKLMNÑOPQRSTUVWXYZ0123456789- BCDEFGHIJKLMNÑOPQRSTUVWXYZ0123456789-A El mensaje HOLA MUNDO, con clave 1 sería así HOLAMUNDO IPMBNVÑEP El descifrado simplemente implicaría el método inverso. Si el desplazamiento es un valor distinto de 1, lo único que hay que hacer es construir el alfabeto rotado tantas veces como el desplazamiento Esta clase implementa un sistema de rotado básico para poder efectuar .. code-block:: java public class Cifrador { private String alfabeto= "ABCDEFGHIJKLMNÑOPQRSTUVWXYZ"+ "0123456789 "; private String alfabetoCifrado; /* Dada una cadena como * "ABC" y un número (p.ej 2) * devuelve la cadena rotada a la izq * tantas veces como indique el numero, * en este caso "CAB" */ public String rotar(String cad,int numVeces){ char[] resultado=new char[cad.length()]; for (int i=0; i Aplicacion.jar ``. Con estos pasos se tiene un aplicación firmada que el usuario puede verificar si así lo desea. De hecho, si se extrae el contenido del JAR con ``jar -xf Aplicacion.jar`` se extraen los archivos ``.class`` y un fichero ``META-INF/Manifest`` que se puede abrir con un editor para ver que realmente está firmado. Para que otras personas puedan comprobar que nuestra aplicacion es correcta los programadores deberemos exportar un certificado que los usuarios puedan importar para hacer el verificado. Recordemos que el comando es:: keytool -exportcert -keystore ..\Almacen.store -file Programador.cer -alias Programador Verificado de aplicaciones -------------------------------- Si ahora otro usuario desea ejecutar nuestra aplicación deberá importar nuestro certificado. El proceso de verificado es simple: 1. El usuario importa el certificado. 2. Ahora que tiene el certificado puede comprobar la aplicación con ``jarsigner -verify -keystore Aplicacion.jar `` El comando deberá responder con algo como ``jar verified``. Sin embargo si no tenemos un certificado firmado por alguna autoridad de certificación (CA) la herramienta se quejará de que algunos criterios de seguridad no se cumplen. Ejercicio ----------------- Intenta extraer el archivo JAR y reemplaza el ``.class`` por alguna otra clase. Vuelve a crear el archivo .JAR y vuelve a intentar verificarlo, ¿qué ocurre? Recordatorio --------------- Hemos hecho el proceso de firmado y verificado con **certificados autofirmados**, lo cual es útil para practicar pero **completamente inútil desde el punto de vista de la seguridad**. Para que un certificado sea seguro debemos hacer que previamente alguna autoridad de certificación nos lo firme primero (para lo cual suele ser habitual el tener que pagar). Política de seguridad. ------------------------------------------------------------ Java incluye un mecanismo para definir *políticas de seguridad*. La definición oficial de Java para una política es *objeto que especifica qué permisos están disponibles para el código en función de su origen y del usuario con el que se ejecutan*. Este origen puede ser los diversos directorios del sistema operativo o incluso direcciones URL. Cabe destacar que **todo lo que se menciona aquí no funciona si el usuario tiene acceso al sistema y puede ejecutar el intérprete de Java sin restricciones**. Es decir, se necesita el trabajo de un administrador de sistemas para restringir la manera en la que el usuario ejecuta el código. Supongamos entonces que estamos en un entorno seguro donde los programas Java se ejecutan utilizando un gestor de seguridad, es decir, se lanzan ejecutando ``java -Djava.security.manager Clase``. En principio, los programas no podrán hacer muchas cosas, como por ejemplo, conectarse a Internet o leer un fichero que no esté en el mismo directorio de la clase. Programación de mecanismos de control de acceso. ------------------------------------------------------------ Pruebas y depuración. ------------------------------------------------------------