Docsity
Docsity

Prepara tus exámenes
Prepara tus exámenes

Prepara tus exámenes y mejora tus resultados gracias a la gran cantidad de recursos disponibles en Docsity


Consigue puntos base para descargar
Consigue puntos base para descargar

Gana puntos ayudando a otros estudiantes o consíguelos activando un Plan Premium


Orientación Universidad
Orientación Universidad

Seguridad en el Desarrollo de Aplicaciones: Java y PHP, Apuntes de Criptografía y Seguridad del Sistema

criptografia TRABAJO COMPLETO criptografia TRABAJO COMPLETO

Tipo: Apuntes

2020/2021

Subido el 13/04/2021

juan-daniel-suarez
juan-daniel-suarez 🇨🇴

6 documentos

1 / 27

Toggle sidebar

Esta página no es visible en la vista previa

¡No te pierdas las partes importantes!

bg1
EJE 3
Pongamos en práctica
CRIPTOGRAFÍA Y MECANISMOS
DE SEGURIDAD
Luis Francisco Urrea
Fuente: Shutterstock/ 671164009
pf3
pf4
pf5
pf8
pf9
pfa
pfd
pfe
pff
pf12
pf13
pf14
pf15
pf16
pf17
pf18
pf19
pf1a
pf1b

Vista previa parcial del texto

¡Descarga Seguridad en el Desarrollo de Aplicaciones: Java y PHP y más Apuntes en PDF de Criptografía y Seguridad del Sistema solo en Docsity!

EJE 3

Pongamos en práctica

CRIPTOGRAFÍA Y MECANISMOS

DE SEGURIDAD

Luis Francisco Urrea

Fuente: Shutterstock/ 671164009

ÍNDICE

  • Introducción Contenido
  • Técnicas de cifrado
    • Criptografía en Java
      • Procedimiento de encriptación en Java
    • Encriptación en NET
      • Funciones de Hash en NET
    • Encriptación en base de datos con PHP
      • Inyección SQL
      • SALT
      • Función crypt en PHP
  • Uso de variables de sesión y no cookies
    • Session hijacking o man in the middle
    • Vulnerabilidad en parámetros Get/Post
  • Conclusión
  • Bibliografía

Técnicas de cifrado

Puerta trasera Es un tipo de vulnerabilidad que implica la existencia de una posible falla de seguridad con acceso no controlado a una aplicación o sis- tema Se puede generar de forma voluntaria o producto de errores en la programación

Criptografía en Java

Antes de hablar de la codificación referente a la seguridad y la encriptación de infor- mación en desarrollo de aplicaciones bajo el entorno de aplicación Java, es necesario apreciado estudiante que se haga claridad en algunos términos relacionados:

- Java es un lenguaje de programación orientado a objetos Los programas que se escriben y compilan bajo este lenguaje se crean en un lenguaje independiente del entorno del sistema operativo y se conocen como bytecode Así, para ejecutar una aplicación de este tipo se requiere una plataforma independiente de ejecución - Java es un entorno de ejecución bajo el cual se desarrollan instrucciones creadas a través del lenguaje de programación Esto implica que para ejecutar cualquier programa que se encuentre escrito y compilado en el lenguaje Java debemos ins- talar entonces un entorno de aplicación que se conoce como máquina virtual de Java o JVM Este entorno, depende entonces de la arquitectura bajo la cual se va a ejecutar la implementación, así tendremos JVM para Windows, para Linux, para arquitecturas de 32 y 64 bits; y por supuesto la seguridad que se incorpore en las aplicaciones depende de la máquina virtual - Existe un tercer componente de Java que se conoce como API (Application Program- ming Interface), y está compuesta por un conjunto de paquetes o bytecodes de Java que ya se encuentran ejecutados y compilados para facilitar al programador el uso de interfaces, controles de entrada y salida y por supuesto en el caso que nos ocupa, fun- ciones de seguridad y encriptación de resumen, de firmas digitales y de encriptación

Instrucción

Para ampliar este tema, les invito a consultar la infografía que encontrará en los recursos de aprendizaje de este eje

La seguridad en el entorno de aplicación Java, se puede abordar desde dos instancias distintas a saber:

- Seguridad en el entorno de ejecución: la eje- cución de un programa compilado en bytecode de Java se efectúa sobre la JVM, así para evitar que los programas accedan a recursos que no son necesarios, o abran una “puerta trasera” En la creación del código debemos implementar controles tendientes a garantizar la seguridad de nuestras aplicaciones

- Durante la compilación, Java verifica que las variables asignadas correspondan a los tipos que el desarrollador asigna - Los atributos y métodos únicamente serán visibles según el nivel de acceso que haya concedido el programador a los miembros de las clases - La modificación de los atributos desde ellos mismos, o de una clase a partir de la creación de una subclase se im- pide a través de la incorporación del modificador “final”

Cuando se compila un programa en Java se crean los bytecodes, la máquina virtual de Java traduce los bytecodes en código de sistema y lo ejecuta en medida que lo interpreta Entonces, cuando se ejecuta un programa bajo la JVM, no se interpreta un lenguaje de alto nivel, así la velocidad de ejecución en Java es más alta que en otras aplicaciones

Atributos En lenguaje Java, un atributo es una constante que hace referencia a al- guna de las propiedades del objeto

Métodos En Java hacen referencia a un con- junto de características comunes dentro de la clase y que se pueden definir y nombrar

Bytecode En Java hace referencia al código que se programa expresado ya en términos de máquina, es decir casi todo en (0 y 1)

La seguridad en el entorno de aplicación de java se ejecuta en tres instancias a saber:

- La carga de clases: las clases de sistema, clases de extensión del sistema y las clases de usuario se cargan en el orden en que se han enunciado, así cuando se encuentra la clase que se requiere se detiene la carga y no es posible para el pro- gramador modificar el orden de carga - La JVM, incorpora un verificador de archivos de clases que se encarga de validar los bytecodes para garantizar que han sido creados bajo un compilador apropiado de Java, así se declaran clases confiables, las clases del sistema y las que el usuario ha validado, estas no se verifican y las que no corresponden a estas categorías son objeto de validación por parte de la máquina virtual - JVM incorpora una clase del sistema que se conoce como verificador en tiempo de ejecución, así establece un control de acceso en tiempo de ejecución para evitar que clases de la misma aplicación usen recursos que no se encuentran previstos en toda la aplicación

Para crear aplicaciones que se puedan ejecutar bajo el entorno de aplicación Java, debemos usar como herramienta de desarrollo el Java Development Kit (JDK)

En el entorno de desarrollo de Java se incorporan las características de seguridad que se describen a continuación:

- Control de acceso de grano fino: asigna permisos específicos a porciones espe- cíficas de código para que accedan a recursos específicos del cliente, esto validado contra la firma y/o la URL a través de la cual se obtiene el código

Visitar página

- Control de acceso sobre el código: se puede firmar a través de firmas digitales todo el código del desarrollo de aplicación - Al incorporar un fichero de políticas (policy file): permite asignar roles y permisos para el acceso a los recursos del sistema Así, hace posible que el usuario descargue aplicaciones de la red, las instale y ejecute con los recursos que tiene asignados - Se pueden incorporar (tipos de permiso) predefinidos para el acceso a los recursos del sistema sin crear un nuevo método

Figura 1 Seguridad de código Fuente: https://goo gl/jkkerg

Como ustedes saben, existe una amplia base de códi- gos de programación que podemos emplear como API o clases en Java de acuerdo a las necesidades que se ajusten al caso particular del programa que deseamos desarrollar Así, en el tema que nos ocupa les recomiendo descargar la biblioteca que contiene el desarrollo de las clases para encriptar el contenido de un mensaje en Java usando los algoritmos MD5, SHA-HEX, SHA-256/

API Conjunto de comandos, instrucciones y protocolos para la creación de programas en un lenguaje específico

Esta biblioteca creada por Apache Software Foundation, se encuentra disponible en el sitio web de la fundación y puede acceder a ella a través del enlace:

Apache Commons

https://goo gl/zwAm6B

4. Una vez hemos cargado la librería podemos emplear la clase incluida en ella, para

disponer de algoritmos de encriptación En nuestro proyecto llamamos la clase Di- gestUtils, para esto, en la sección import de nuestro código escribimos la instrucción:

org.apache.commons.codec.digest.DigestUtils;

Con ello podremos definir el tipo de algoritmo que vamos a emplear para encriptar nuestra información

Así, para encriptar el texto usando uno de los algoritmos que incluye la clase DigestU- tils, debo definir los métodos según el algoritmo a emplear:

- MD5: DigestUtils md5Hex - SHA: DigestUtils sha1Hex - SHA256: DigestUtils sha - SHA512: DigestUtils sha

En la ventana a continuación, se definen las líneas de código que encuentra en la ventana de NetBeans que se muestra en la imagen así:

Línea 1: define una cadena que va a contener el texto a encriptar “nuestro primer proyecto Cripto Java”

Línea 2: define la variable de tipo cadena de caracteres criptMD5, que almacena el resultado de aplicar la clase DigestUtils con el método md5Hex sobre la cadena texto a encriptar

Línea 3: pide una salida en la que se muestra el mensaje de salida “texto encriptado MD5 ”, seguido del contenido de la variable de tipo string criptMD

Para simplificar el proceso, en la misma clase que se está trabajando se ponen los códigos que corresponden a cada uno de los métodos de encriptación que incluye la clase DigestUtils Al final encontrará en la ejecución los resultados de la encriptación del mensaje bajo cada método

El código que corresponde al proyecto Cripto1, para encriptar un string con la clase DigestUtils bajo los métodos MD5, SHA, SHA256 y SHA512 en Java, compilado en Net Beans queda escrito así:

Figura 3 Cripto1 Java Fuente: propia

La estructura del proyecto se visualiza en la siguiente imagen:

Figura 4 Proyecto Fuente: propia

Y la salida que nos entrega el programa es la siguiente:

Figura 5 Run Cripto Fuente: propia

Instrucción

Para conocer más acerca de este framework revise el organizador gráfico de los recursos de aprendizaje

El conjunto de lenguajes de programación hace referencia a los distintos lenguajes sobre los cuales se puede hacer desarrollo para NET, así en la actualidad se puede escribir código en C++, Delphi, Python, Visual Basic, Cobol, Perl entre otros

La biblioteca de clases BCL, incorpora las funciones mínimas que debe soportar el entorno de trabajo o framework, para que el sistema operativo facilite la ejecución de los programas bajo el entorno de aplicación

El Common Languaje Runtime o entorno común de ejecución para los distintos lengua- jes de programación que soporta NET se constituye en el core o núcleo del framework Así, el código que se escribe en cualquier lenguaje que soporta el entorno se compila a través de la herramienta de desarrollo en un código intermedio común muy parecido a los bytecodes de Java Equivale en NET, al Just In Time compilator o JIT

Para conseguir independencia entre la plataforma y arquitectura del lado del cliente y el código bajo el cual se desarrolla la aplicación, se emplea el compilador JIT, así este framework puede soportar la ejecución de diferentes lenguajes de programación, bajo distintas plataformas de hardware de forma que se recomiende su uso en aplicaciones que se pueden ejecutar bajo el concepto de servicios web En la actualidad muchos desa- rrolladores se encuentran comprometidos en la creación de complementos que permitan el uso de esta plataforma para otros sistemas operativos, la compilación en lenguajes distintos al inglés y la escritura de módulos o bloques que complementen las bibliotecas de clases, los módulos, y componentes Con estos aportes se constituye NET en una de las herramientas más robusta de desarrollo de servicios en el mercado

Funciones de Hash en .NET

Para lograr transformar los datos de entrada en una función HASH o resumen de una clave o un string, NET dispone de los siguientes algoritmos:

- MD5: algoritmo de Hash que ofrece una salida fija de 128 bits - SHA: al igual que vimos en Java se trabaja como SHA1 y genera una salida fija de 160 bits - SHA 256: ofrece una salida fija de 256 bits - SHA 512: ofrece una salida fija de 512 bits - KeydHashAlgoritm: puede usar algoritmos HMAC y MACTripleDES

Cualquiera de los algoritmos de resumen que se enumeran en la lista implica la existen- cia de una clave, desde nuestra experiencia se recomienda el uso de la función SHA512, porque ofrece el mayor nivel de encriptación y la velocidad de ejecución del algoritmo en la máquina es muy rápida, en otros apartados se aclaró por qué no se recomienda el uso de MD

Así, cada conjunto de datos que se negocia entre la aplicación y el servidor debe estar cifrado y el servidor compara el valor del HASH del conjunto que recibe con el valor almacenado ¿Pero si en el medio un atacante intenta por fuerza bruta descubrir la clave?

Con el uso de las funciones resumen sin clave, el servidor sólo puede comparar los datos enviados con el resumen que recibió y verificar si los datos han sido objeto de modifica- ción, un atacante con cierto nivel de conocimiento puede identificar el tipo de algoritmo que estamos usando, y enviar al servidor una transmisión con un resumen creado bajo el mismo algoritmo con lo que el servidor supone válidos los datos y le permite al intruso acceder a los demás Se recomienda entonces el uso de funciones que acompañan la transmisión de datos resumidos con HASH de claves como el HMACSHA

El código en NET para generar una clave de este tipo es:

Figura 6 Net Fuente: propia

Para que los desarrolladores puedan atender de forma satisfactoria situaciones como la que se expone en el ejemplo, se genera una nueva fun- ción para facilitar el intercambio de claves y funciones resumen en distintos tipos de aplicación, esta función se conoce con el nombre de SALT, como se informó en el desarrollo del eje 2, esta función también es usada por el programa de mensajería instantánea WA para generar claves aleatorias de un sólo uso La clave se puede transmitir en texto plano como parte de la autenticación de una sesión Como el valor de SALT cambia por cada sesión el valor HASH será distinto para cada una Para otorgar un nivel de seguridad adicional, es posible usar generadores criptográficos para la plataforma de desarrollo NET como el RGNCryptoServiceProvider

Pero al acompañar la función resumen de la clave, nos encontramos con el siguiente problema, la variable almacena la clave o el resumen

SALT Un tipo de Hash al que se agrega un número de dígitos aleatorios puede ser al inicio o al final, así el HASH no se incluye en la tabla y di- ficulta su criptoanálisis

TripleDESCryptoServiceProvider TDES = new TripleDESCryptoServiceProvider();

Si deseamos generar varias claves es necesario inicializar el vector varias veces así:

TripleDESCryptoServiceProvider TDES = new TripleDESCryptoServiceProvider(); TDES.GenerateIV(); TDES.GenerateKey();

A continuación, se presenta el código de un programa escrito en la plataforma de desarrollo NET bajo el lenguaje de programación C# Por su extensión usaremos una captura de pantalla del código fuente y una ventana con el producto del texto encriptado, en la actividad propuesta, usted apreciado estudiante va a identificar algunos elementos clave del programa que se presenta La clase que usa el programa se invoca así:

using System.Security.Cryptography;

Figura 8 Tamaño de claves NET Fuente: propia

Figura 9 Servicio para generar claves RSA Fuente: propia

Figura 10 Función Desencriptar Fuente: propia

Inyección SQL

Al escribir código para PHP es necesario validar información contra una base de datos (MySQL, PostgreSQL, Oracle, etc ) así, las consultas que se elevan desde la aplicación, atien- den los parámetros que provienen de GET o POST, en este orden de ideas, aunque en una pequeña proporción cada vez que un usuario del sitio web accede a las consultas que existen en ella, de cierto modo está modificando las consultas SQL de nuestro sitio web

De igual forma, un usuario con algún conocimiento de programación, puede construir una consulta SQL con propósitos oscuros, con resultados desafortunados para nuestra web y por supuesto para usted como programador, así un usuario no autorizado podría loguearse de forma exitosa en una zona restringida de nuestra web sin conocer ningún usuario y contraseña

Ejemplo

Como es común cuando escribimos código, definimos un usuario que casi nadie conoce en el desarrollo de aplicaciones Usuario: pruebas o usamos como password una clave también muy difícil de intuir: clave_pruebas Estos dos valores se almacenan en nuestra base de datos Para identificar a los usuarios que acceden a la base de datos se expiden la solicitud de parámetros por POST, se usan las variables $_POS- T[‘usuario’] y $_POST[‘clave’]

Luego de esto elevamos la consulta SQL:

mysql_query(‘select id from usuariosWeb where usuario = ‘”.$_POST[‘usuario’].”’ and password =‘”.$_POST[‘clave’].”’’);

Cuando nuestro formulario recibe la solicitud que se realiza, encuentra el usuario y contraseña asociados que, por supuesto corresponden, procede a permitir el login, pero si un usuario que desconoce el password y tiene un ligero conocimiento de PHP incluye en la consulta el siguiente parámetro:

$_POST[‘clave’] =”m’ or 1=’1”

PHP responde la petición con un valor válido para identificarse así no cuente con la contraseña asociada al usuario, se imaginan los problemas que una situación como esta podría causar en nuestro sitio

Por suerte ya existen métodos muy simples para evitar que este tipo de situaciones se presenten, aunque existen múltiples métodos empecemos por el más simple; sustituir las comillas simples y dobles de todos los parámetros POST, para ello debemos introducir en la programación el siguiente código:

foreach($_POST as $key => $value) { $_POST[$key] = str_replace(“’”,””,$value); $_POST[$key] = str_replace(‘”’,’’,$value); }

Como se ha visto durante el presente curso, un método muy simple para el cifrado de password es el uso de funciones de resumen, por ejemplo, el HASH md5, sin embargo y como he repetido en múltiples descripciones, la seguridad de este método se vio compro- metida desde el año 2004, cuando a partir de colisiones varios analistas lograron obtener valores de resumen iguales para entradas diferentes Sin embargo, su uso sencillo y la imposibilidad de obtener el valor original a partir del resumen, hace que en la actualidad siga siendo un método aplicado por los desarrolladores, eso sí acompañado de nuevas técnicas que protegen la vulnerabilidad del resumen, una de estas técnicas es el uso de las funciones SALT

Como se explicó en el método que usa la aplicación de mensajería WA para cifrar las comunicaciones, la contraseña del usuario se resume con md5 y se acompaña de un SALT En la actualidad los desarrolladores de aplicaciones acostumbran el uso de métodos de cifrado como SHA1, y md5 acompañados de esta función

* SALT

$password = ‘areandina’; $salt = ‘$cripto$/’; echo $s_salt = md5($salt. $password);

Aquí, en PHP a la contraseña “areandina” que se resume con el algoritmo md5 se le aplica una “sal” definida por el desarrollador llamada “cripto”, el valor de la salida al aplicar la función junto a la “sal” será:

d7b492c23aa45af645bcb4e7037113f

SALT

Como se explicó en la sección de NET, en la actualidad esta es la forma de uso más extendido para el cifrado de contraseñas, pues agregar una palabra aleatoria o “sal” a la clave precompartida, hace que los atacantes que usan fuerza bruta o diccionarios para tratar de adivinar las claves no cuenten con suficientes elementos para romper nuestra seguridad

Para usar una función SALT en PHP, existen dos opciones; usted como desarrollador puede indicar la palabra o letras que va a agregar como “sal” a la contraseña resumida con una función como SHA1 o md5, por ejemplo: