0% encontró este documento útil (0 votos)
68 vistas32 páginas

Técnicas de Programación Segura en Criptografía

Este documento describe las técnicas de programación segura, incluyendo la introducción a la criptografía, los servicios de seguridad como la confidencialidad y la integridad, y los orígenes históricos de la criptografía desde el antiguo Egipto hasta los sistemas modernos. Explica cómo la criptografía protege la privacidad de datos en el almacenamiento y transmisión a través de métodos como el cifrado de mensajes, firmas digitales y protocolos seguros.

Cargado por

inmiana
Derechos de autor
© © All Rights Reserved
Nos tomamos en serio los derechos de los contenidos. Si sospechas que se trata de tu contenido, reclámalo aquí.
Formatos disponibles
Descarga como PDF, TXT o lee en línea desde Scribd
0% encontró este documento útil (0 votos)
68 vistas32 páginas

Técnicas de Programación Segura en Criptografía

Este documento describe las técnicas de programación segura, incluyendo la introducción a la criptografía, los servicios de seguridad como la confidencialidad y la integridad, y los orígenes históricos de la criptografía desde el antiguo Egipto hasta los sistemas modernos. Explica cómo la criptografía protege la privacidad de datos en el almacenamiento y transmisión a través de métodos como el cifrado de mensajes, firmas digitales y protocolos seguros.

Cargado por

inmiana
Derechos de autor
© © All Rights Reserved
Nos tomamos en serio los derechos de los contenidos. Si sospechas que se trata de tu contenido, reclámalo aquí.
Formatos disponibles
Descarga como PDF, TXT o lee en línea desde Scribd

Tema 5.

Utilización de técnicas de programación segura

Autor: Joan Pou


Desarrollo de Aplicaciones Multiplataforma. Programación de servicios y procesos
Tema 5. Utilización de técnicas de programación segura

Tema 5: Utilización de técnicas de


programación segura

F P
¿Qué aprenderás? I A
N K


Entender cómo funcionan los algoritmos de criptografía
LI
• Utilizar funciones hash para calcular resúmenes.
N O
Encriptar mensajes utilizando claves simétricas y asimétricas.



Firmar mensajes digitalmente.
Encriptar comunicaciones. U M
AL
L E
¿Sabías que…? IB
I M
• P R
El santo Grial de la criptografía histórica es el Manuscrito

IM
Voynich, escrito entre 1404 y 1438, cuyo contenido es aún
ininteligible y cuyo código no se ha podido romper.
• N
Ó
El algoritmo de clave simétrica DES se rompió en 1998 por un
I
R Sataque de fuerza bruta (72.000 billones de posibilidades),
debido a la poca longitud de su clave 56 bits.

VE • SSL y TLS son los protocolos que utilizan la mayoría de


servidores de Internet para enviar las comunicaciones cifradas.

1
Desarrollo de Aplicaciones Multiplataforma. Programación de servicios y procesos
Tema 6. Utilización de técnicas de programación segura

5.1. Introducción a la criptografía

5.1.1. Criptografía, privacidad y aplicaciones

La privacidad de datos es el servicio de seguridad que garantiza que no se pueda


acceder libremente a su contenido. Solo podrán acceder a los mismos las personas que
están autorizadas.
La privacidad de datos es necesaria tanto en el almacenamiento de la información,F P
I A
por ejemplo en los datos almacenados en la nube como en la transmisión entre diferentes
dispositivos.
N K
LI
Para conseguir que la información solo sea accesible a los usuarios autorizados y
evitar que pueda ser interceptada por personas no autorizadas se utilizan métodos
criptográficos.

N O
La palabra Criptografía proviene del griego "kryptos" que significa oculto, y

U M
"graphia", que significa escritura, y su definición según el diccionario es "Arte de escribir
con clave secreta o de un modo enigmático". La Criptografía es un conjunto de técnicas,

AL
que tratan sobre la protección o el ocultamiento de la información frente a accesos no
autorizados


La criptografía nos puede ayudar a:
L E
Evitar el acceso no autorizado a una información.
• IB
A la inserción de información extra en el mensaje.

I M
Identificar entidades y autentificación.

• P R
Control de acceso a los recursos.
Confidencialidad, integridad y no repudio de los mensajes.

IM
Definiremos encriptar como la acción de proteger la información, utilizando un

N
algoritmo de cifrado, transformándola utilizando una clave secreta, para que sea

Ó
incomprensible para toda persona que no tenga la clave.
I
R S
La criptografía es una disciplina con multitud de aplicaciones, entre las más
importantes destacamos las siguientes:

V E • Seguridad de las comunicaciones. El establecimiento de canales seguros sobre redes de


ordenadores que no lo son, es una de las principales aplicaciones de la criptografía.
Con la potencia de cálculo actual y empleando los algoritmos adecuados se consigue no
perder velocidad en las transmisiones.
• Identificación y autentificación. Gracias al uso de firmas digitales y otras técnicas
criptográficas es posible identificar a un individuo o validar el acceso a un recurso en un
entorno de red con más garantías que un sistema tradicional.
• Certificación. La certificación es un esquema mediante el cual una entidad certificadora
validan la identidad de usuarios reales.

2
Desarrollo de Aplicaciones Multiplataforma. Programación de servicios y procesos
Tema 5. Utilización de técnicas de programación segura

• Comercio electrónico. Gracias al empleo de canales seguros y a los mecanismos de


identificación se posibilita el comercio electrónico, ya que tanto las empresas como los
usuarios tienen garantías de que las operaciones no pueden ser espiadas, reduciéndose
el riesgo de fraudes y robos.

5.1.2. Servicios de seguridad

Los servicios de seguridad son las propiedades de los sistemas de comunicación de


información que la criptografía intenta garantizar. Las más importantes son:

• Confidencialidad: solamente los usuarios autorizados tienen acceso a la información. F P


• Integridad de la información: garantía ofrecida a los usuarios de que la información
I A

original no será alterada, ni intencional ni accidentalmente.
N K
LI
Autenticación de usuario: es un proceso que permite al sistema verificar si el usuario
que pretende acceder o hacer uso del sistema es quien dice ser.
• Autenticación de remitente: es el proceso que permite a un usuario certificar que el

• N O
mensaje recibido fue de hecho enviado por el remitente y no por un suplantador.
Autenticación del destinatario: es el proceso que permite garantizar la identidad del


usuario destinatario.
U M
No repudio en origen: que cuando se reciba un mensaje, el remitente no pueda negar


haber enviado dicho mensaje.
AL
No repudio en destino: que cuando se envía un mensaje, el destinatario no pueda


negar haberlo recibido cuando le llegue.
L E
Autenticación de actualidad (no replay): consiste en probar que el mensaje es actual, y
IB
que no se trata de un mensaje antiguo reenviado.

I M
R
5.1.3. Orígenes de la criptografía
P
IM
Podemos pensar que la criptografía es un arte muy moderno en el que los
referentes pueden ser la NSA, Alan Turing o Claude Shannon, pero sus orígenes se
N
remontan a más de 4000 años. En todo este tiempo podemos destacar:

I Ó
En el antiguo Egipto se necesitó a la Piedra Rosetta para descifrar los jeroglíficos,

R•
S
aunque estos no tenían intención militar.
En el libro de Jeremías de la Biblia se hace referencia a Atbash un sistema de sustitución

VE de letras que se usaba para cifrar mensajes y se remonta al año 600 a.C.
• En la “Ilíada” de Homero en la Antigua Grecia se hace referencia al uso de cartas
cifradas (carta cifrada por el rey Preto).
• El cifrado por transposición lo utilizaban los espartanos enrollando un pergamino sobre
una estaca llamada escítala.
• En la antigua Roma se utilizaba el cifrado del César donde cada letra se sustituye por
otra letra que se encuentra un número fijo de posiciones más adelante en el alfabeto.

3
Desarrollo de Aplicaciones Multiplataforma. Programación de servicios y procesos
Tema 6. Utilización de técnicas de programación segura

• En el siglo IX Al-Kindi con su análisis de frecuencia estableció les bases de como romper
mensajes cifrados gracias al estudio del Corán.
• Los Estados Pontificios en el renacimiento utilizaban un sistema de codificación basado
en discos llamado cifrado de Alberti.
• En 1518 Johannes Trithemius publicó un tratado sobre codificación llamado
Polygraphia.
• El primer centro de criptografía de Francia fue el Cabinet Noir utilizada por los ministros
de Luis XV y durante la revolución francesa.
• Charles Babbage (que desarrolló la máquina anílitica) trabajó en el descifrado de los
códigos de Vigenère que se consideraban extremadamente robustos.
F P
• I A
Auguste Kerckchoffs publicó en 1883 un tratado con sus 6 principios básicos que debía
cumplir un sistema criptográfico.
N K
LI
• En la primera guerra mundial, Alemania desarrolló el código Ubchi.
• En la segunda guerra mundial Alemania cifraba sus comunicaciones utilizando la

Alan Turing diseñaron Colossus para descifrar estos mensajes. N O


máquina Enigma. Un grupo de ingenieros y matemáticos entre los que se encontraba

5.1.4. Criterios de Shannon U M


AL
L E
Claude Shannon en el artículo Communication Theory of Secrecy Systems en 1949
establece que los algoritmos de cifrado han de utilizar dos técnicas básicas para

IB
enmascarar el texto claro y proteger la información: la difusión y la confusión. Con estas
técnicas convierten el mensaje en un criptograma imposible de descifrar si no se conoce la
clave.
I M
P R
La difusión pretende difundir las características del texto en claro en todo el
criptograma, ocultando de esta forma la relación que existe entre el texto en claro y el

IM
texto cifrado. Se aplicarán operaciones de transposición o permutación de letras, bytes, o
bloques de bytes, de esta manera los elementos aparecerán desordenados en el
criptograma. N
I Ó
La confusión pretender confundir al atacante, de manera que no le sea sencillo
S
establecer una relación entre el criptograma y la clave de cifrado.
R
V E Según Shannon las características que deben cumplir los sistemas de cifrado y
descifrado para proporcionar un sistema seguro son:
• El trabajo para descifrar el texto cifrado debe suponer tal cantidad de trabajo que hace
que no sea rentable hacerlo.
• Las claves deben ser de sencillas y fáciles de construir.
• Los sistemas secretos, una vez conocida la clave, deben ser simples pero han de
destruir la estructura del mensaje en claro para dificultar su análisis.
• Los errores de transmisión no deben originar ambigüedades.
• La longitud del texto cifrado no debe ser mayor que la del texto en claro.
4
Desarrollo de Aplicaciones Multiplataforma. Programación de servicios y procesos
Tema 5. Utilización de técnicas de programación segura

En el siguiente ejemplo vemos una implementación del cifrado del César. En este
método cada letra se sustituye por otra letra que se encuentra un número fijo de
posiciones (3) más adelante en el alfabeto.

F P
I A
N K
LI
N O
U M
AL
L E
IB
I M
P R
IM
N
Ejemplo de ejecución:
I Ó
R S
VE

5
Desarrollo de Aplicaciones Multiplataforma. Programación de servicios y procesos
Tema 6. Utilización de técnicas de programación segura

5.2. Sistemas de cifrado de clave asimétrica

Los sistemas de cifrado simétrico son aquellos que utilizan la misma clave para cifrar
y descifrar un documento. El principal problema de seguridad reside en el intercambio de
claves entre el emisor y el receptor ya que ambos deben usar la misma clave. Este
intercambio debe realizarse por un canal seguro.

Es importante que la clave sea compleja para evitar que se adivine en ataques de
fuerza bruta (probar todas las combinaciones posibles hasta encontrar la válida). Estos
F P
sistemas presentan un buen rendimiento pero al utilizar una sola clave compartida su
validez se pone en entredicho a medida que se va utilizando. I A
N K
LI
N O
U M
AL
L E
IB
I M
R
Los principales algoritmos de cifrado simétrico son el DES, el 3DES y el AES.
P
IM (Data Encryption Standard)
5.2.1. Algoritmo DES

N
I Ó El DES es el nombre del documento FIPS (Federal Information Processing Standard)
del Instituto Nacional de Estándares y Tecnología (NIST) del Departamento de Comercio de

R S
Estados Unidos. Fue publicado en 1977. Es el algoritmo de cifrado simétrico más empleado
del mundo y más estudiado.

VE DES es un algoritmo de cifrado por bloques, donde se toma un texto en claro de


longitud fija de bits y se transforma mediante una serie de operaciones en otro texto
cifrado de la misma longitud.
Se aplican tres fases en la encriptación:
• Permutación inicial para dotar de confusión y difusión al algoritmo.
• Sustitución mediante Cajas-S previamente definidas que comprimen la información, la
permutan y la sustituyen (16 etapas)

6
Desarrollo de Aplicaciones Multiplataforma. Programación de servicios y procesos
Tema 5. Utilización de técnicas de programación segura

• Permutación final inversa.


El tamaño del bloque de DES es de 64 bits, y la longitud de clave también es de 64
bits, aunque en realidad solo son 56 bits los que pertenecen a la clave ya que los otros 8
bits son de comprobación de paridad, y se descartan.
El DES era el estándar del Gobierno de los EEUU para comunicaciones desde 1976.
En 1998 se rompió con un ataque de fuerza bruta por la poca longitud de su clave (72.000
billones de posibilidades)

5.2.2. Algoritmo 3DES (Triple Data Encryption Standard)


F P
I
Se basa en aplicar el algoritmo DES tres veces, desarrollado por IBM en 1998. Este A
versiones:
N K
algoritmo no cambia el método de cifrado sólo la longitud de la clave. Existen diferentes


LI
DES-EDE2 utiliza dos claves, en el primer y tercer proceso de encriptación usan la
misma clave, 128 bits (112 útiles)

N O
DES-EDE3 utiliza tres claves diferentes, por tanto 196 bits (168 útiles)

U M
3DES aumenta de forma significativa la seguridad del sistema de DES, pero requiere
más recursos del ordenador. Se sigue utilizando mucho en sistemas de pago electrónico.

A L
5.2.3. Algoritmo AES (Advanced Encryption Standard)

L E
IB
AES es un algoritmo simétrico adoptado como estándar por el gobierno de los EEUU
a partir del año 2002 y fue creado en Bélgica por Joan Daemen y Vincent Rijmen.

I M
El sistema criptográfico AES opera con bloques de tamaño fijo de 128 bits y claves

PR
de longitudes variables, hay AES de 128bits, de 192 bits y de 256 bits.
El resultado intermedio del cifrado constituye una matriz de bytes de cuatro filas
IM
por cuatro columnas. A esta matriz se le vuelve a aplicar una serie de bucles de cifrado

N
basado en operaciones matemáticas. AES tiene 10 rondas para llaves de 128 bits, 12
rondas para llaves de 192 bits y 14 rondas para llaves de 256 bits.
I Ó
R S Este algoritmo es el más conocido entre los usuarios de routers, ya que WPA opera
con AES como método de cifrado.

VE5.2.4. La clase KeyGenerator, la Interfaz Key y la Interfaz KeySpec


En java se pueden utilizar dos tipos de claves key: opacas y transparentes. Las claves
opacas se usan de forma directa en los algoritmos de cifrado y descifrado y no nos
proporcionan acceso a los componentes de la clave.
Las claves transparentes ofrecen acceso a sus componentes para que se puedan
intercambiar entre diferentes entidades, usuarios o aplicaciones.

7
Desarrollo de Aplicaciones Multiplataforma. Programación de servicios y procesos
Tema 6. Utilización de técnicas de programación segura

La interfaz Key ([Link]) representa una clave opaca y la interfaz KeySpec


([Link]) se utiliza para representar claves transparentes.
La Clase KeyGenerator proporciona funcionalidades para generar claves secretas
para usarse en algoritmos simétricos. Algunos métodos son:
• getInstance(String algoritmo):Devuelve un objeto KeyGenerator que genera claves
secretas para el algoritmo especificado:AES,DES,3DES.
• init(int Keysize): Inicializa el generador de claves para un determinado tamaño de
clave.
• SecretKey generateKey(): Genera una clave secreta.

F P
En general, lo primero que se debe hacer es crear un generador de claves
IA
proceso de inicialización.
N K
especificando el algoritmo de encriptación. La longitud de la llave se especifica en el

LI
Algunos algoritmos usados en los sistemas criptográficos simétricos utilizan llaves
de longitud fija mientras que otros lo utilizan de longitud variable. Con el método init
podemos especificar esa longitud.
N O
A partir de este generador podemos obtener una clave mediante el método
generateKey() de la clase KeyGenerator.
U M
AL
L E
IB
5.2.5. La clase Cipher I M
P R
La clase [Link] encapsula un sistema criptográfico que puede cifrar o
IM
descifrar datos y puede ser aplicado tanto a algoritmos simétricos como asimétricos.

N
Los objetos de la clase Cipher ([Link]) representan funciones de

I Ó
cifrado o descifrado. Se crean especificando el algoritmo que se desea utilizar.

R S
Posteriormente pueden ser configurados para realizar tanto operaciones de cifrado como
descifrado, indicando en el proceso la clave necesaria. Los métodos más importantes son:

V E • getInstance(String algoritmo): Crea un objeto Cipher que implementa el algoritmo


especificado. También se puede especificar el proveedor.
• init(int modo, Key clave): Configura al objeto para que realice la operación. Los modos
de funcionamiento son: Cipher.ENCRYPT_MODE (encriptar) y Cipher:DECRYPT_MODE
(desencriptar datos). Para inicializar el objeto hay que proporcionar una clave.
• dofinal (byte[] entrada) Realiza la operación para la que se ha configurado el objeto.
Recibe los bytes para cifrar o descifrar como parámetro y devuelve el resultado de la
transformación.

8
Desarrollo de Aplicaciones Multiplataforma. Programación de servicios y procesos
Tema 5. Utilización de técnicas de programación segura

Una vez tenemos la clave, la encriptación se hace creando un objeto de la clase


cipher, especificando el algoritmo y se inicializa este objeto con la clave que acabamos de
crear. Finalmente realizaremos la encriptación o desencriptación de los datos contenidos
en un array de tipo byte y los devolveremos en otro array.

F P
I A
N K
LI
En el siguiente ejemplo vemos todo el proceso de encriptación y desencriptación de
un mensaje utilizando el algoritmo simétrico AES de 128 bits.

N O
U M
AL
L E
IB
I M
P R
IM
N
I Ó
R S
VE

9
Desarrollo de Aplicaciones Multiplataforma. Programación de servicios y procesos
Tema 6. Utilización de técnicas de programación segura

El resultado del mismo se puede apreciar en la siguiente captura:

5.3. Función Hash

Un message digest o resumen de mensajes (también se le conoce como función


hash) es una marca digital de un bloque de datos. F P
Una función hash es un algoritmo matemático que resume el contenido de un IA
K
mensaje en una cantidad de información fija menor. Sirven para proporcionar pruebas de
N
LI
la integridad de la transferencia de información denominadas en ingles MAC (Message
Authentication Codes). Se utilizan sobre todo en el intercambio de ficheros.
Una función hash debe cumplir una serie de requisitos:

N O
• M
La descripción de la función de descifrado debe ser pública, muchas no utilizan clave
para evitar tener que distribuirla. Y rápida de calcular. U

AL
El texto en claro puede tener diferentes tamaños, pero el resultado del resumen (hash)


siempre debe tener una longitud fija.

L E
Como generamos resumen de menor tamaño debe ser muy difícil encontrar dos textos
IB
de entrada diferentes que den el mismo resumen.

I M
Solo se puede aplicar en un sentido, a partir de un resumen no se puede obtener el
texto en claro.

P R
IM
N
I Ó
R S
V E

Existen varios algoritmos para implementar funciones hash, entre los que se
pueden destacar MD5, SHA-1 y SHA-2. Estos algoritmos no necesitan ninguna clave. MD5
genera resúmenes de 128 bits mientras que SHA-1 de 160 bits. SHA-2 tiene diferentes
longitudes de bits 256, 384 y 512.

10
Desarrollo de Aplicaciones Multiplataforma. Programación de servicios y procesos
Tema 5. Utilización de técnicas de programación segura

La clase MessageDigest ([Link]) permite a las aplicaciones


implementar algoritmos de resumen de mensajes, como MD5, SHA-1 o SHA-256. Dispone
de un constructor protegido, por lo que se accede a él mediante el método getInstance
(String algoritmo).

Algunos métodos de la clase son:


• getInstance(String algoritmo):Devuelve un objeto MessageDigest que implementa el
algoritmo resumen especificado.
• update(byte[] entrada): Actualiza el objeto con la información pasada como
parámetro. Va acumulando la información si se invoca varias veces. F P
• reset(): Reinicializa el objeto para un nuevo uso.
I A
• digest(byte[] entrada): Realiza el cálculo del resumen sobre toda la información
N K
LI
almacenada.

En el siguiente ejemplo vemos como crear a partir de un texto un resumen y


guardarlo en un fichero.
N O
U M
AL
L E
IB
I M
P R
IM
N
I Ó
R S
VE

11
Desarrollo de Aplicaciones Multiplataforma. Programación de servicios y procesos
Tema 6. Utilización de técnicas de programación segura

Para verificar el resumen accedemos al fichero, leemos primero los datos originales
y después el resumen calculado. Con los datos originales volvemos a calcular el resumen y
comparamos si son iguales.

F P
IA
N K
LI
N O
U M
AL
L E
IB asimétrica
5.4. Sistemas de cifrado de clave
I M
PR
La criptografía de clave asimétrica también es conocida como clave pública, emplea

IM
dos llaves diferentes en cada uno de los extremos de la comunicación. Este sistema fue
diseñado para evitar el problema de la distribución de las claves entre el emisor y el
N
receptor.

I Ó Cada usuario deberá poseer una pareja de claves: una clave pública y otra privada.

R
•S La clave privada tendrá que ser protegida y guardada por el propio usuario, será
secreta y no la deberá conocer nadie.

VE • La clave pública será accesible a todos los usuarios del sistema de comunicación.
Los algoritmos asimétricos están basados en funciones matemáticas fáciles de
resolver en un sentido, pero muy complicadas de realizar en sentido inverso sin conocer la
llave. Las claves públicas y privadas están ligadas la una a la otra y se generan al mismo
tiempo. Para que resulte muy difícil que obtengamos una a partir de la otra esta relación
debe ser muy compleja.
Si una persona desea enviar un mensaje cifrado, buscará la clave pública de aquel a
quien desea enviárselo, y lo cifrará con dicha clave. La única forma de desencriptarlo es
utilizando la clave privada del receptor.
12
Desarrollo de Aplicaciones Multiplataforma. Programación de servicios y procesos
Tema 5. Utilización de técnicas de programación segura

F P
I
Si una persona con una pareja de claves cifra un mensaje con la llave pública, ese A
K
mensaje sólo podrá ser descifrado con la llave privada asociada. Y si se cifra con la privada,
N
LI
se descifra con la pública, en este caso no es cifrado es autentificación.

5.4.1. Algoritmo RSA


N O
U M
Debe su nombre a sus tres inventores: Ronald Rivest, Adi Shamir y Leonard
Adleman, del MIT. Es un algoritmo de cifrado por bloques, que utiliza una clave pública

AL
conocida por todos y otra clave privada guardada en secreto por su propietario.
La fortaleza de este algoritmo reside en la complejidad de cálculo que tiene

L E
encontrar los factores primos de un número compuesto muy grandes. Con el algoritmo
RSA los valores de los factores primos deben tener un mínimo de 155 dígitos, lo que
IB
aproximadamente son 512 bits. El producto de estos valores tiene alrededor de 310 dígitos

I M
que se representan aproximadamente en 1024 bits, lo cual puede dar una idea de lo
costoso a nivel de hardware para encontrar la clave.

P R
El algoritmo funciona de la siguiente forma. Se eligen al alzar y en secreto dos

IM
números primos p y q lo suficientemente grandes. Y siempre se realizan los siguientes
pasos:

N
1. Hacer n=p*q

I Ó 2. Calcular z=(p-1)*(q-1)

R S 3. Elegir un pequeño número k, coprimo de z, de modo que el Máximo Común


Divisor entre z y k sea 1, con 1<k<z

VE 4. Encontrar un número j tal que el (j mod z) sea 1


5. Publicar k y n como la clave pública.
6. Guardar j como la clave privada.

A partir de los cálculos anteriores para cifrar y descrifrar los mensajes utilizamos las
siguientes fórmulas:
mensajecifrado=(mensajeplano)^k mod n
mensajeplano=(mensajecifrado)^j mod n

13
Desarrollo de Aplicaciones Multiplataforma. Programación de servicios y procesos
Tema 6. Utilización de técnicas de programación segura

5.4.2. La clase KeyPairGenerator

Para cifrar un mensaje en Java utilizando el algoritmo RSA necesitaremos generar


dos claves, una pública y otra privada. En otros casos, estas claves las podemos leer de un
fichero y utilizarlas en nuestro código.
La clase KeyFactory ([Link]). Se usa como factoría de claves. La
clase KeyPairGenerator([Link]) nos permite generar el par de
claves. Dispone de un constructor protegido al que accederemos con el método
getInstance. Los métodos más importantes son:
• getInstance(String algoritmo): Devuelve un objeto KeyPairGenerator que genera un
F
par de claves pública y privada para el algoritmo [Link] un objeto Cipher
P
IA
que implementa el algoritmo especificado. También se puede especificar el proveedor.
• K
initialize(int keysize): Inicializa el generador de las claves para un determinado tamaño
N
LI
de clave.
• generateKeyPair() Genera el par de claves.

5.4.3. La clase KeyPair N O


U M
KeyPair ([Link]). Los objetos de esta clase se utilizan para almacenar
los pares de claves. Dispone de dos métodos:
AL

• L E
PrivateKey getPrivate() Devuelve una referencia a la clave privada.
PublicKey getPublic() Devuelve una referencia a la clave pública.

IB
I M
La interfaz PublicKey ([Link]) implementa la interfaz Key, y se

P R
emplea para representar claves públicas y la interfaz PrivateKey ([Link])
implementa la interfaz Key, y se emplea para representar claves privadas.

IM
El siguiente ejemplo generamos las claves para el algoritmo RSA:

N
I Ó
R S
V E
Para cifrar y descifrar utilizamos el mismo objeto CIPHER que utilizamos en el
cifrado simétrico. Para cifrar con el ENCRYT_MODE y para descifrar con el
DECRYPT_MODE. En el ejemplo se puede observar que se cifra con la clave pública y se
descifra el mensaje con la clave privada.

14
Desarrollo de Aplicaciones Multiplataforma. Programación de servicios y procesos
Tema 5. Utilización de técnicas de programación segura

F P
I A
N K
LI
N O
U M
AL
L E
IB
I M
P R
IM
N
I Ó
RS
VE

15
Desarrollo de Aplicaciones Multiplataforma. Programación de servicios y procesos
Tema 6. Utilización de técnicas de programación segura

5.5. La firma digital y electrónica

La firma digital es un mecanismo criptográfico que se utiliza para que el receptor del
mensaje firmado digitalmente pueda identificar al emisor del mismo y confirmar que el
mensaje no se ha sido modificado desde que fue firmado. En la firma digital por tanto
encontramos tres características básicas: autentificación, no repudio e integridad.
• Autentificación: Identificar al firmante de forma inequívoca.
• Integridad. Asegura que el documento firmado es exactamente igual que el original y
no ha sufrido ni alteraciones ni modificaciones.
F P

I A
No repudio: Los datos que se utilizan para el firmado son únicos, por tanto el autor de
la firma no puede decir que no ha firmado el documento.

N K
LI
N O
U M
AL
L E
IB
I M
El proceso básico de la firma digital es el siguiente:

P R
El emisor dispone de un documento que desea firmar (pdf, Word, …).

• IM
Se aplica una función hash al documento y se obtiene el resumen.
Con la clave privada del emisor se cifra el resumen y obtenemos la firma digital.
N
I ÓLa firma electrónica permite verificar la autenticidad del emisor y la integridad

R S
de los datos utilizando un procedimiento electrónico y dejando registro de la fecha y
hora de la misma.

V E La principal diferencia con la firma digital es que la firma electrónica tiene


naturaleza legal y la firma digital hace referencia a una serie de métodos criptográficos.

16
Desarrollo de Aplicaciones Multiplataforma. Programación de servicios y procesos
Tema 5. Utilización de técnicas de programación segura

5.5.1. La clase Signature

La clase Signature ([Link]) se utiliza para realizar operaciones de


firmado digital. Un objeto de esta clase se puede utilizar para generar y verificar firmas
digitales.
El proceso de firma es muy parecido al de cifrar, existen dos claves, la pública y la
privada. Las claves que se obtienen de la misma forma.
Los nombres de los algoritmos de cifrado suelen tener el formato XXXwithYYY, al
especificar el algoritmo de firma también se especifica el de resumen. Los más utilizados
son el MD5withRSA (cifrado asimétrico RSA y resumen MD5), el SHA1withDSA (cifrado DSA
F P
con resumen SHA1) o el algoritmo DSA.
I A
La clase dispone de un constructor protegido y se accede mediante el método
getInstance(). Los métodos más importantes son:
N K
• LI
getInstance(String algoritmo): Devuelve un objeto Signature que implementa el


algoritmo especificado.

N O
initSign(PrivateKey privateKey): Inicializa el objeto para la firma. Se especifica la clave


privada del emisor que va a generar la firma.
update(byte[] data): Actualiza los datos a firmar.
U M
AL
• byte sign(): Devuelve un conjunto de bytes con la firma de los datos.
• initVerify(PublicKey publickey): Inicializa el objeto para verificar la firma. Necesita la

• L E
clave pública del emisor que va a firmado.
verify(byte[] signature): Verifica la firma pasada como parámetro.
IB
M
Las fases en el proceso de firma de un mensaje son las siguientes:
I


P R
Generar la llave pública y la llave privada.
getInstance(). Creación de una instancia Signature. Se debe conocer el algoritmo de

IM
firma digital. Ejemplos DSA (Digital Signature Algorithm) o MD5withRSA (cifrado
asimétrico RSA+resumen MD5) o [Link]ón de los datos.
• N
initSign(). Inicialización de la instancia Signature para firmar. Clave privada.

I Ó
update(). Inserción de los datos en la instancia Signature. Se actualiza el contenido del

R•
S
objeto con los datos que se desean firmar.
sign(). Generación de la firma.

VE Las fases en el proceso de firma de un mensaje son las siguientes:


• Obtención de la clave pública del emisor.
• getInstance().Creación de una instancia Signature. Se debe conocer el algoritmo de
firma digital.
• initVerify(). Inicialización de la instancia Signature para verificar. Se le debe
proporcionar la clave pública.
• update(). Inserción de los datos en la instancia Signature. Se actualiza el contenido del
objeto con los datos que se desean verificar.
17
Desarrollo de Aplicaciones Multiplataforma. Programación de servicios y procesos
Tema 6. Utilización de técnicas de programación segura

• verify(). Verificación de la firma. Esto produce un resultado lógico indicando si la firma


proporcionada verifica la integridad de los datos introducidos.

En el siguiente ejemplo, se crea la firma de un mensaje y luego se verifica. Se utiliza


el algoritmo DSA.

F P
I A
N K
LI
N O
U M
AL
L E
IB
I M
P R
IM
N
I Ó
R S
V E

18
Desarrollo de Aplicaciones Multiplataforma. Programación de servicios y procesos
Tema 5. Utilización de técnicas de programación segura

5.6. Certificado digital

El certificado digital es un documento digital que incluye un conjunto de datos cuyo


objetivo es identificar a una persona a través de Internet. La comisión Europea lo define
como “Una declaración electrónica que vincula los datos de validación de una firma con
una persona física y confirma, al menos, el nombre o el seudónimo de esa persona”.
El certificado digital se ha convertido en un elemento esencial para realizar un gran
número de trámites desde un ordenador o de un dispositivo móvil con la Administración
Pública (e-Administración) y también en el sector privado. Los certificados digitales son
F P
emitidos y firmados por una autoridad certificadora autorizada (CA).
I A
El certificado más usado es el que emite el departamento del CERES de la Fábrica
Nacional de Moneda y Timbre y se puede utilizar para:
N K
• Presentación y liquidación de impuestos.
LI


Cumplimentar los datos del censo electoral.
Trámites relacionados con las multas de circulación. N O
• Subvenciones.
U M
AL
• Consultar historial médico, cambiar de médico o pedir una cita.
• Trámites relacionados con la Seguridad Social.

L E
IB
Los certificados digitales más usados utilizan el estándar X.509 para estructurar el

• I M
contenido de la información. Este formato incluye:


P R
La identidad del propietario o servicio (puede ser un servidor web).
La clave pública del propietario.

IM
La fecha de caducidad.

N
La firma digital del certificado firmado por la CA de toda la información contenida.

I Ó
R S
V E

19
Desarrollo de Aplicaciones Multiplataforma. Programación de servicios y procesos
Tema 6. Utilización de técnicas de programación segura

5.7. Almacenar y recuperar claves en ficheros

Para almacenar la clave privada en disco es necesario codificarla en formato PKCS8


usando la clase PKCS8EncodedKeySpec. Dispone de los siguientes métodos:
• PKCS8EncodedKeySpec(byte[] encodedKey): Crea un objeto con la clave codificada.
• byte[] getEncoded(): Devuelve los bytes codificados de la clave utilizando el estándar
PKCS#8.
• String getFormat(): Devuelve el nombre del formato de codificación asociado con esta
especificación de clave.
F P
IA
usando la clase X509EncodedKeySpec. Los métodos más importantes son:
N K
Para almacenar la clave pública en disco es necesario codificarla en formato X.509

• LI
X509EncodedKeySpec(byte[] encodedKey): Crea un objeto con la clave codificada.

O
byte[] getEncoded(): Devuelve los bytes codificados de la clave utilizando el estándar
X.509
N

M
String getFormat(): Devuelve el nombre del formato de codificación asociado con esta
especificación de clave.
U
AL
Para recuperar las claves de los ficheros utilizamos a clase KeyFactory que nos

L E
proporciona métodos para convertir las claves en formato criptográfico (PCKS8 y X.509) a
especificaciones de claves y viceversa. Los métodos más importantes son:
• IB
getInstance(String algoritmo): Devuelve un objeto KeyFactory capaz de importar y
I M
exportar las claves generadas con un determinado algoritmo.

• P R
PrivateKey generatePrivate(KeySpec KeySpec) Genera un objeto de clave privada.
PublicKey generatePublic(KeySpec KeySpec) Genera un objeto de clave pública.

IM
N
I Ó
R S
V E

20
Desarrollo de Aplicaciones Multiplataforma. Programación de servicios y procesos
Tema 5. Utilización de técnicas de programación segura

F P
I A
N K
LI
N O
U M
AL
L E
IB
I M
P R
IM
N
I Ó
RS
VE

21
Desarrollo de Aplicaciones Multiplataforma. Programación de servicios y procesos
Tema 6. Utilización de técnicas de programación segura

5.8. Cifrar y descifrar con claves definidas por el usuario

La clase SecretKeySpec especifica una clave secreta independiente del proveedor.


De esta manera se puede utilizar para construir una clave secreta a partir de un conjunto
de bytes sin necesidad de pasar por un SecretKeyFactory. Se utiliza para cifrar y descifrar
mensajes con claves predefinidas.
En el siguiente ejemplo vemos cómo podemos cifrar y descifrar un mensaje
utilizando el algoritmo AES con una clave definida por el usuario.

F P
IA
N K
LI
N O
U M
AL
L E
IB
I M
P R
IM
N
I Ó
R S
V E

22
Desarrollo de Aplicaciones Multiplataforma. Programación de servicios y procesos
Tema 5. Utilización de técnicas de programación segura

5.9. Servicios seguros en red

Hoy en día es muy importante garantizar el intercambio de información seguro por


la red. Esto se consigue integrando dentro de las comunicaciones algún protocolo que
utilizando criptografía proteja los datos antes de ser enviados.
Uno de los protocolos más utilizados y extendidos es el protocolo SSL (Secure
Sockets Layer). Es el protocolo que utilizan todos los navegadores web para acceder a
servidores seguros de correo electrónico, bancos, tiendas online, etc.
El proceso es seguro gracias a un modelo de clave mixta, en el que se emplea una F P
I
clave asimétrica para establecer la sesión, y un cifrado simétrico para las comunicaciones A
SSL (Secure Sockets Layer) y de su sucesor el TLS (Transport Layer Security).
N K
posteriores. En internet la mayoría de estas comunicaciones hacen uso de los protocolos

LI
Los protocolos SSL y TLS ofrecen una interfaz de programación en Java basada en
sockets stream. Java dispone de un conjunto de clases que permiten utilizarlo sin muchas
complicaciones.
N O
U M
Los protocolos SSL y TLS garantizar el establecimiento y mantenimiento de una
sesión segura agregando las siguientes características de seguridad:

AL
• Autentificación de servidor. El servidor dispone de un certificado que emplea para que
los clientes puedan confiar en que se están conectando al elemento adecuado.

L E
El cliente genera la clave de sesión simétrica y la envía al servidor cifrada con la clave

• IB
pública del servidor. Esto garantiza que solo el servidor pueda recibirla y utilizarla.
Confidencialidad. La privacidad de las comunicaciones está garantizada gracias a la
clave de sesión simétrica.
I M
• R
Integridad. Mediante el cálculo de resúmenes se garantiza que los mensajes que se
P
intercambian no se pueden alterar de ninguna forma.
IM
N
I Ó
R S
V E

23
Desarrollo de Aplicaciones Multiplataforma. Programación de servicios y procesos
Tema 6. Utilización de técnicas de programación segura

JSSE (Java Secure Socket Extension) es un conjunto de paquetes que permiten el


desarrollo de aplicaciones seguras en Internet. Proporciona un marco y una
implementación para la versión Java de los protocolos SSL y TSL e incluye funcionalidad de
encriptación de datos, autenticación de servidores, integridad de mensajes y
autentificación de clientes.
Con JSSE, los desarrolladores pueden ofrecer intercambio seguro de datos entre un
cliente y un servidor que ejecuta un protocolo de aplicación, tales como HTTP, Telnet o
FTP, a través de TCP/IP. Las clases de JSSE se encuentran en los paquetes [Link] y
[Link].

de las ya conocidas Socket y ServerSocket respectivamente.


F P
Las clases SSLSocket y SSLServerSocket representan sockets seguros y son derivadas

IA
JSSE tiene dos clases SSLServerSocketFactory y SSLSocketFactory para la creación de
sockets seguros. No tienen constructor, se obtienen a través del método estático
N K
LI
getDefault().
• SSLSocket ([Link]). Clase similar a Socket, pero incorporando SSL. Sirve


para representar sockets stream de clientes seguros.

N O
SSLSocketFactory ([Link]). Clase generadora de objetos


SSLSocket.
U M
SSLServerSocket ([Link]). Clase similar a ServerSocket, pero


AL
incorporando SSL. Sirve para representar sockets stream de servidores seguros.

objetos SSLServerSocket.
L E
SSLServerSocketFactory ([Link]). Clase generadora de

IB
Para crear una aplicación que utilice SocketsSSL se realiza de la misma forma que

I M
con Sockets y ServerSockets. La única diferencia es que estos objetos se crean usando las
clases generadoras SSLSocketFactory y SSLServerSocketFactory.

P R
IM
N
I Ó
R S
V E

24
Desarrollo de Aplicaciones Multiplataforma. Programación de servicios y procesos
Tema 5. Utilización de técnicas de programación segura

Ejemplo de programa que usa sockets stream seguro para intercambiar un mensaje
por la red. La implementación del servidor seria la siguiente:

F P
I A
N K
LI
N O
U M
AL
L E
IB
I M
P R
IM
N
I Ó
R S
VE

25
Desarrollo de Aplicaciones Multiplataforma. Programación de servicios y procesos
Tema 6. Utilización de técnicas de programación segura

El cliente se implementa de la siguiente forma:

F P
IA
N K
LI
N O
U M
Si ejecutamos el Cliente y el Servidor seguro nos da un error. Para que esta

AL
comunicación se pueda establecer, se debe disponer de un certificado de servidor válido
en el que confíe el cliente.

L E
IB
I M
El servidor necesita disponer de un certificado que mostrar a los clientes que se

P R
conecten a él. Usaremos la herramienta keytool para crearlo, en el ejemplo le damos el
nombre de AlmacenCertificados y el valor de la clave es 123456. La sintaxis es la siguiente:

IM
keytool -genkey -alias ejemploSSL -keystore AlmacenCertificados

N
I Ó
R S
V E

26
Desarrollo de Aplicaciones Multiplataforma. Programación de servicios y procesos
Tema 5. Utilización de técnicas de programación segura

En general, lo primero que se debe hacer es crear un generador de claves


especificando el algoritmo de encriptación. La longitud de la llave se especifica en el
proceso de inicialización.
Para ejecutar el programa servidor es necesario indicar dos parámetros:
• [Link]= Ruta donde se almacena el certificado.
• [Link]=Clave

F P
A
El cliente necesita acceder al fichero de llaves para permitir la validación. Si está en
I
indicar el certificado y la clave con los parámetros:
N K
diferentes ordenadores se puede exportar a un fichero .cer. En nuestro caso solo debemos



[Link]= Ruta donde se almacena el certificado.
[Link] =Clave LI
N O
U M
AL
En el ejemplo anterior para ejecutar el programa cliente y servidor seguro se han

L E
establecido las propiedades JSSE desde la línea de comandos. También se pueden

String valor). IB
establecer desde el programa usando el método [Link](String propiedad,

I M
En el programa servidor incluimos las siguientes líneas después de definir la variable
puerto:
P R
IM
N
I Ó
R S Y en el programa cliente:

VE

27
Desarrollo de Aplicaciones Multiplataforma. Programación de servicios y procesos
Tema 6. Utilización de técnicas de programación segura

Recursos y enlaces
• Certificados electrónicos CERES.

F P
I A
• DNI electrónico.
N K
LI
N O
U M
Conceptos clave AL

L E
Cifrado simétrico: Las claves de cifrado y descifrado son las mismas.

B
Cifrado asimétrico: El cifrado se realiza con la clave pública conocida por todos y el
descifrado con la clave privada. I
• I M
HASH: Función de resumen para validar que un documento no se ha alterado.
• R
SSL: Protocolo para cifrar las comunicaciones entre un cliente y un servidor.
P
IM
N
I Ó
R S
V E

28
Desarrollo de Aplicaciones Multiplataforma. Programación de servicios y procesos
Tema 5. Utilización de técnicas de programación segura

Test de autoevaluación

El no repudio hace referencia a:


a) Comprobar la recepción del mensaje por el receptor.
b) Que no se produzcan errores de transmisión.
c) Certificar que el envío del mensaje se ha hecho y no pueda ser negado.
d) Que el emisor y el receptor se hayan identificado.
F P
La interfaz SecretKey. I A
a) Representa una clave asimétrica.
N K
b) Representa una clave simétrica.
LI
c) Permite generar claves aleatorias.
d) Implementa un mecanismo de hash. N O
U M
AL
Son algoritmos de cálculo Hash
a) MD5 y SHA1
b) RSA.
L E
c) 3DES y AES
I B
d) SSL y TLS.
I M
P R
Ponlo en práctica
IM
N
I Ó
Actividad 1

R S
VE Realiza un programa para cifrar un fichero con el algoritmo AES y una clave de 128
bits. El programa guardará en un fichero el mensaje cifrado y en otro la clave.

29
Desarrollo de Aplicaciones Multiplataforma. Programación de servicios y procesos
Tema 6. Utilización de técnicas de programación segura

SOLUCIONARIOS

Test de autoevaluación

El no repudio hace referencia a:


e) Comprobar la recepción del mensaje por el receptor.
f) Que no se produzcan errores de transmisión. F P
g) Certificar que el envío del mensaje se ha hecho y no pueda ser negado. IA
h) Que el emisor y el receptor se hayan identificado.
N K
LI
La interfaz SecretKey.
e) Representa una clave asimétrica. N O
f) Representa una clave simétrica.
U M
AL
g) Permite generar claves aleatorias.
h) Implementa un mecanismo de hash.

L E
Son algoritmos de cálculo Hash
IB
e) MD5 y SHA1
I M
f) RSA.
g) 3DES y AES P R
h) SSL y TLS. IM
N
I Ó
Ponlo en práctica
R S
E
V Actividad 1
Realiza un programa para cifrar un fichero con el algoritmo AES y una clave de 128
bits. El programa guardará en un fichero el mensaje cifrado y en otro la clave.

30
Desarrollo de Aplicaciones Multiplataforma. Programación de servicios y procesos
Tema 5. Utilización de técnicas de programación segura

Solución Actividad 1

F P
I A
N K
LI
N O
U M
AL
L E
IB
I M
P R
IM
N
I Ó
R S
VE

31

También podría gustarte