Uso de técnicas de programación segura
Sumario
Introdución
Profundizaremos na seguridade das comunicacións de datos entre procesos que se executan en ordenadores; concretamente en que os datos que un proceso emisor envía a outro proceso receptor:
- cheguen inalterados
- só ó receptor previsto
- e ten un modo de verificar que esto foi así
No caso de que cheguen a algún outro, garantirase que non poida comprender a información codificada (que lle resulten inintelixible). Isto acádase encriptando ou cifrando os datos.
Os términos cifrado e encriptación aditan empregarse coma sinónimos, máis existe algún matiz que os diferencia. Podemos dicir que o cifrado ten un significado máis específico que encriptación, e que sempre é reversible; isto é, partindo do texto cifrado seempre se pode obter o texto orixinal.
Comunicaciones de datos
Amosanse na figura os elementos que interveñen nunha comunicación entre dúas partes: unha que actúa como emisor e outra que actúa como receptor.
A información que se desexa transmitir codifícase e se transmite de emisor a receptor por un medio de comunicación. Cando a comunicación é entre dous procesos de ordenador, a mensaxe codifícase en binario (coma unha secuencia de ceros e unos).
o medio de comunicación non ten porque ser o ideal xa que as mensaxes:
- podense deteriorar, de xeito que se altere a súa información
- poden no chegar o seu destino
O medio adoita ser compartido con outros emisores e receptores. Implica isto:
- que poden ter acceso ó medio usuarios non previstos ou incluso maliciosos, que poden escoitar ou ter acceso as mensaxes que se transmiten polo medio, e incluso alterarlos
- o emisor non ten a seguridade total de que a mensaxe chegue ó receptor nin de que o faga inaleterado
- o receptor non ten forma de asegurar que a mensaxe proven do supuesto emisor.
En resumo o medio é inseguro ou non fiable.
A canle:
- adoita ser bidireccional (permite a comunicación en ambos sentidos)
- así pois ambas partes pueden actuar coma emisor e coma receptor, nunha comunicación duplex o bidireccional;o ocontrario é de tipo simplex ou unidireccional.
- e se poden actuar simultáneamente coma emisor e receptore trátase dunha comunicación full-duplex; o contrario (non poden simultáneamente) trátase dunha comunicación de tipo half-duplex.
Aspectos de seguridade nas comunicacións de datos
Os aspectos fundamentales da seguridade nas comunicacións de datos son os seguintes:
- Integridade
- Os datos que recibe o receptor son idénticos os que emitiu o emisor (non foron alterados en ningún punto intermedio no medio de comunicación). As alteracións poden ser:
- por fallos do propio medio (fallos eléctricos se a información se transmite por cables ou ópticos se se transmite por fibra óptica) ou interferencias de todo tipo
- ademáis da acción posible dalgún usuario malientencionado que desexa alterar os datos
- Confidencialidade
- os datos transmitidos só son intelixibles para o receptor previsto da mensaje (na práctica non se poderá impedir con total seguridade que cheguen a algún destinatario non previsto ou ilexítimo). Porén, os datos deben ser intelixibles só para o destinatario previsto, o que se acada enviando a mensaxe encritpada (e só o destinatario previsto será capaz de desencriptalo)
- Autenticación
- o receptor da mensaxe pode estar seguro de que o emisor da mensaxe é quen espera que sexa (o emisor da mensaxe é quen di ser e non un suplantador)
- Non repudio
- o receptor da mensaxe pode demostrar, unha vez recibida unha mensaxe dun emisor, que a mensaxe foi emitida polo devandito emisor. Deste xeito se o emisor negara ter emitido esa mensaxe, se lle podrá refutar.
As implicacións e a relevancia destes aspectos son distintas segundo os contextos nos que se produza a comunicación de datos entre procesos. Non ten os mesmos requisitos de seguridade unha comunicación entre dous fíos dun mesmo proceso a través de memoria compartida, que entre dous procesos que se executan en ordenadores de redes distintas e que deben pasar a través de múltiples redes a priori descoñecidas e sobre as que non se ten ningún control. Nun contexto así, o único que pode garantir a confidencialidade dos datos é a súa encriptación.
Funcións de hash
As funcións hash utilízanse para verificar a integridade do contido das mensaxes e para firma dixital, que garante a súa autenticación e non repudio.
Para comprender plenamente as funcións hash e as súas características é preciso a comprensión dos seus fundamentos desde unha perspectiva computacional. Pero non ímos profundizar moito neses conceptos, buscando comprender a grosso modo o seu funcionamento, e centrándonos máis no seu uso e posibilidades.
Unha función de hash ou digest fai corresponder a cada secuencia de bytes (por larga que sexa) cunha cadea de lonxitude fixa (e relativamente curta). O cálculo do hash ou digest para unha secuencia de bytes é moi rápido; pola contra é prácticamente imposible obter unha secuencia de bytes á que corresponda un valor de hash determinado. Dise por tanto que as funcións de hash son funcións unidireccionais (one-way functions).
MD5
Un exemplo de función de hash é MD5:
- a unha secuencia de bytes de calquer tamaño faille corresponder un valor de 128 bits.
Esta función está implementada en Linux no comando md5sum. Está implementado tamén en linguaxes:
- de scripting coma PHP como MD5.
- en Java, usando a clase MessageDigest, ou con librerías externas coma Apache Commons ou Guava
Aínda que altamente improbable, pode producirse unha colisión de hash: unha situación que se produce cando dúas entradas distintas a unha función de hash producen a mesma saída. E de feito, MD5 xa non se considera segura desde que no ano 2006 probouse unha implementación de colisións en MD5 que pemite crear archivos de lonxitude arbitraria que teñan hash MD5 idéntico e que difieren en só 128 bytes nalgún lugar en mitad do fichero (ataques coñecidos coma de tipo chosen-prefix)
SHA
SHA é unha familia de funcións criptográficas hash publicadas polo Instituto Nacional de Estándares y Tecnología (NIST):
Só SHA-0 é vulnverable, aínda que en SHA-1 xa se constataron debilidades matemáticas que fan peligrar a súa seguridade a medio prazo.
Controversia A NSA é unha axencia de inteligencia do goberno dos Estados Unidos. Diseña moitos métodos e moitos dos algoritmos criptográficos ampliamente utilizados na actualidade. Isto suscita controversia por ser a NSA unha axencia de intelixencia dun goberno, e que pode estar especialmente interesada en atopar e explotar vulnerabilidades dos sistemas informáticos e das comunicacións. De feito a NSA participa nos procesos criptográficos do NIST.
Cres que pode haber un conflicto de intereses? Que a seguridade deses algoritmos criptográficos pode estar garantida?
Sabías qué...? E común o uso de sha256 para a minería de criptomonedas coma Bitcoin ou os certificados das páxinas web. Noutros campos, coma no uso de GIT, xa se está camiño de implementar, a data de finales de 2021
Outras funcións hash
Outras funcións hash utilizadas son:
Propiedades dunha función hash
Todas as funcións hash comparten unhas propiedades importantes, que son requisitos para que se poida considerar unha boa función de hash.
Non reversibilidade
Debe ser prácticamente imposible obter unha secuencia para a que a función de hash calcule un valor determinado. Con esto non se garante a imposibilidade teórica, se non a imposibilidade práctica; debe ter un coste computacional enorme atopar unha secuencia de bytes para a que o seu valor de hash sea un determinado.
Pódese calcular rápidamente o hash MD5 para un valor determinado; pero á inversa, é na práctica case imposible averiguar un valor que teña ese hash MD5. Normalmente haberá moitos porque as funcións de hash non son inyectivas; mais en principio o único xeito de atopar un sería calculando o hash MD5 para una secuencia tras outra ata que para algunha se obteña o valor de hash buscado. Entón atoparemos o que se chama unha colisión de hash.
Esta estratexia de probar un valor tras outro ata atopar un valor cun mesmo valor de hash é un ataque de forza bruta para atopar unha colisión de hash.
Para reflexionar. Ningunha boa función hash pode evitar a colisión hash...por qué? Hai un principio matemático que o fai máis fácil de entender, que é o principio das caixas: Hai dez mazas na mesa. Debes poñer estas dez manzás en nove caixas. Non importa cómo as coloques, descubriremos que haberá ó menos dúas mazós en cando menos unha caisa.
Unha das aplicacións das funcións de hash que aproveita esta propiedade é a validación de contrasinais sen necesidad de almacenar o seu valor. En troques o que se almacena é o resultado de aplicar a función de hash o contrasinal. Cando se quere verificar un contrasinal introducida por un usuario do sistema, calcúlase o valor de hash e se compara co previamente almacenado. Por exemplo en sistemas Linux, no ficheiro /etc/shadow almacena un hash dos contrasinais en lugar dos propios contrasinais.
Unha colisión de hash, é dicir, unha secuencia de caracteres que teña como valor de hash o almacenado neste ficheiro, permitiría dar por válida como contrasinal esa secuencia de caracteres.
Uniformidade
O número de posibles secuencias é moi superior o número de posibles valores que pode tomar a función de hash. Porén, cada posible valor de hash corresponderá en xeral a múltiples secuencias. A propiedade de uniformidade consiste en que cada valor de hash corresponde, aproximadamente, o mesmo número de secuencias; isto é, que non debe haber valores de hash sobrerrepresentados que teñan notablemente máis tendencia a sair como resultado da función de hash.
Discontinuidade
Pequenas variacións na secuencia de bytes deberían dar como resultado grandes variacións no valor do hash calculado. Por exemplo cambiando un só byte nun ficheiro de moitos megabytes, a variación no valor do seu hash debería ser sustancial. o novo valor debería estar moi alonxado (na súa representación binaria deberían cambiar moitos bits), e ó longo de toda ela.
Funcións hash máis frecuentemente utilizadas
A modo de resumo, esta táboa amosa as funcións hash mais utilizadas:
| Función | Descripción |
|---|---|
| MD5 | Creado por Ronald Rivest en 1991. Produce valores de 128 bits. Utilízase ampliamente para verificar a integridade de ficheiros. Descubrironse vulnerabilidades que non o fan apropiado para o seu uso actual en criptografía. |
| SHA-1 | Produce valores de 160 bits. Desenvolto pola National Security Agency (NSA). Na actualidade tampouco se considera coas suficientes garantías de seguridade. |
| SHA-2 e SHA-3 | Producen valores de 224, 256, 384 o 512 bits segundo a variante. SHA3 ten variantes que permiten xerar valores de hash de lonxitude arbitraria. |
| Algoritmo | MD4 | MD5 | SHA-1 | RIMPD-160 |
|---|---|---|---|---|
| Tamaño do resumo | 128 bits | 128 bits | 160 bits | 160 bits |
| Tamaño do bloque | 512 bits | |||
| Número de pasos | 48 | 64 | 80 | 160 |
| Operacións por volta | 16/3 | 16/4 | 20/4 | 32/5 |
| Nº de vectores de inicialización | 4 (32bits) | 5 (32bits) | ||
| Forza da preimaxe | 2 elevado a 128 | 2 elevado a 128 | 2 elevado a 160 | 2 elevado a 160 |
| Forza contra ataque de colisión | 2 elevado a 20 | 2 elevado a 64 | 2 elevado a 80 | 2 elevado a 80 |
Integridade nas comunicacións de datos
As propiedades anteriores (non reversibilidade, uniformidade e discontinuidade) dunha función de hash, así como a lonxitude fixa e relativamente pequena dos valores de hash, fan posible e viable na práctica o seu uso para verificar a integridade dunha mensaxe transmitida por un medio inseguro.
Para iso achégase coa mensaxe o seu valor de hash. No destino calcúlase o valor de hash sobre a mensaxe recibide e se compara co que se achegou na mensaxe. Se coinciden, podese estar seguro de que o contido da mensaxe noj foi alterado desde a súa emisión.
Criptografía
O término criptografia ven das palabras greegas kryptós (que significa oculto) e graphé (que significa escritura). O obxectivo da criptografra é ocultar o significado dunha mensaxè meáiante o cifrado ou codificación da mensaxe.
O proceso xeral de cifrado e descifrado de mensaxes amosase na figura:
- Se a un texto lexible se lle aplica un algoritmo de cifrado, que en xeneral depende dunha clave, esto da como resultado un texto cifrado que se envia ou almacena; a este proceso se lle chama cifrado o encriptación.
- Se a ese texto cifrado se lle aplica o mesmo algoritmo, dependente da misma clave ou doutra clave (dependendo do algoritmo), obtense o texto legible original; a este segundo proceso chámselle descifrado ou desencriptación.
A encriptación de datos pódese facer:
- con criptografía de clave pública, que adquiríu unha importancia decisiva co crecemento de internet.
- con criptografía de clave privada.
Moitos métodos criptográficos usan criptografía tanto de clave pública como de clave privada:
De clave privada (ou simétrica)
A criptografía tradicional é de clave privada. A clave que se utiliza para cifrar unha mensaxe é a mesma que se utiliza para descifralo: é un segredo compartido por emisor e receptor. Xustamente esa é a súa limitación, a dificultade de acordar unha clave entre emisor e receptor.
Quen utilice este tipo de criptografía con outros interlocutores debe dispor dunha clave compartida con cada un deles. Será axeitado se quere comunicar información moi valiosa ou mantendo comunicacións frecuente co mesmo interlocutor.
Nembargantes este tipo de criptografía non será válido para aplicacións coma a administración electrónica ou o comercio electrónico. Como terá o usuario unha clave privada compartida coa empresa que opera o sitio web para facer unha compra?
A criptografía de clave privada pode garantir:
- Confidencialidade. So emisor e receptor coñecen a clave, e só eles poden desencriptar a mensaxe.
- Autenticación. o receptor pode estar seguro de que so o emisor xerou a mensaxe porque só el coñece a clave
A criptografía de clave privada non pode garantir o non repudio. O emisor pode argumentar que unha mensaxe non foie emitida por él, se non polo receptor, e non se lle podería refutar por ter ambos a mesma clave.
As dificultades prácticas para xenerar e compartir claves privadas e a imposibilidade de garantir o non repudio fan que este tipo de criptografía non sexa axeitado para todos os escenarios. Por estar baseada nuhna clave compartida, non é posible ningún mecanismo que poida sustituír a unha firma tradicional. Será a criptografía de clave pública a que fai posibles mecanismos de sintura dixital que poden sustituir as firmas manuscritas ou selos tradicionais.
Algortimos de clave privada
- DES
- Con tamaño de clave de 56 bits. O cifrado aplícase de xeito independente a cada bloque de 64 bits. Desenvolto por IBM en 1976 baixo contrato do Gobierno dos Estados Unidos e con supervisión da NSA. Estivo suxeto a controversia debido a segredos no deseño orixinal que fixeron pensar que podería existir algún tipo de debilidade coñecida pola NSA. O pequeno tamaño de clave tamén resultou sospeitoso; sábese que a NSA influíu para que se reduxera de 128 bits a 64, e de ahí a 56 bits (son 64 pero úsanse 8 para verificación da paridade). Interpretouse que a NSA gozaba de recursos para romper claves deste tamaño.
- RC5
- Desenvolto por Ronald Rivest en 1994. Ten tamaños variables de bloque (32, 64 o 128 bits) e de clave (hasta 2040). Pode realizar tamén un número variable de pasos. Son todos parámetros para o algoritmo.
- 3DES
- Coñecido como triple DES. Desenvolto en 1998 por IBM para triplicar o tamaño da clave de DES, tendo así 168 bits, sen ter que cambiar o algoritmo de cifrado. En realidade a lonxitude efectiva da clave é 112 bits. Non se considera seguro na actualidade pero segue usándose ampliamente: a maioría das tarxetas de crédito e outros medios de pago electrónico utilizan 3DES.
- AES
- Cifrado por bloques de 128 bits. Moito más rápido e sen vulnerabilidades atopadas ata a data. Creouse para un concurso do goberno estadounidense no 2001. Como ganadores seleccionáronse tres variantes da familia de algoritmos de cifrado Rijndael (con lonxitudes de clave de 128, 192 e 256 bits), desenvoltos polos criptógrafos belgas Vincent Rijmen e Joan Daemen.
- Blowfish
- Codificador de bloques deseñado por Bruce Schneier en 1993 que utiliza claves de 32 a 448 bits. Moi popular e ampliamente implementado (aínda que menos que AES). Considérase bastante seguro: non se atoparon técnicas de criptoanálise efectivas contra él. Schneier deseñou Blowfish coma un algoritmo de uso xeral, como alternativa o antiguo DES e otros algoritmos que eran de propiedade privada, patentados ou auspiciados polo goberno estadounidense. Schneier declarou que Blowfish non tería patente e que estaba a disposición do público sendo de uso libre.
| Algoritmo | Características | Ventaxas | Inconvintes |
|---|---|---|---|
| DES | Cifrado Bloques tamaño fixo 64 bits Clave lonxitude fixa 64 bits (56 útiles + 8) Número de iteracións: 16 Tipo Feistel |
Rápido Fácil de implementar FIPS 46-2 |
Corta lonxitude da clave Inseguro: pódese romper con criptoanálise diferencial ou mediante ataques de forza bruta |
| 3DES | Dúas claves de lonxitude fixa 64 bits (56 útiles). Unha cifra e outra descifra DSE-EEE2 y DSE-EDE2 Tres claves de lonxitude fixa 64 bits, lonxitude efectiva 168 bits Dúas configuracións: DES-EEE3 o DES-EDE3 Tipo Feistel |
Seguridade equivalente a un criptosistema de lonxitude de clave igual 112 biys Resistentes a ataques por forza bruta FIPS 46-3 |
Require máis recursos para o cifrado e descifrado |
| IDEA | Cifrado en bloques de 64 bits Clave de lonxitude fixa 128 bits Nº de rondas: 8 |
Doble de rápido que DES Fácil de implementar Inmune ante criptoanálise diferencial e ataques de forza bruta |
Patentado mais permite o seu uso para fins non comerciais |
| AES | Cifrado en bloques de 128 bits Clave de lonxitude variable (128 / 192 / 256 bits) Rondas flexibles (10/12/14) en función da clave |
Rápido Fácil de implementar en HW e SW Requere pouca memoria Resiste a ataques de criptoanálise diferenciais e lineais |
| Algoritmo | Resumo |
|---|---|
| RC4 | Deseñado por Ron Rivest para RSA Data Security Emprégase para encriptación de ficheiros e para encriptar a comunicación en protocolos coma SSL (TLS) |
| A5 | Algoritmo cifrador de fluxo usado para proporcionar privacidade na comunicación ó aire libre no estándar GSM Inicialmente foi mantido en secreto pero chegou ó dominio público debido as súas debilidades e á inxeniería inversa Varias debilidades serias foron identificadas no algoritmo. |
| SEAL: Software Optimized Encryption Algorithm | Xenerador de secuencia deseñado en 1993 para IBM Suxeto a patentes |
De clave pública (ou asimétrica)
A irrupción da criptografía de clave pública comezou a finales dos anos setenta (a partir do traballo de Diffie e Hellman por unha banda e de Rivest, Shamir e Adelman por outra) sendo unha revolución. Permite o intercambio seguro de información (garantindo confidencialidade, autenticación e non repudio) entre interlocutores que non comparten ningún segredo.
Basease na existencia dun par de claves, unha pública e outra privada, entre as que existe unha relación matemática, de xeito que é moi difícil (cunha enorme complexidad computacional, requirindo unha inxente cantidade de cálculo) obter a clave privada a partir da pública (facendo inviable esa obtención mediante forza bruta). Pola contra, é moi sinxelo obter a clave pública a partir da privada.
No algoritmo RSA (Rivest, Shamir e Adelman) a clave pública consiste nun número que é o produto de dous factores primos moi grandes e a clave privada derívase da factorización dese número (dos dous factores primos). Requiere poucos cálculos multiplicar dous números primos tan grandes; pero unha cantidade inxente de cálculos atopar a factorización do número.
A criptografía de clave pública basease no emprego de dúas funcións matemáticas distintas para encriptación e desencriptación, cada unha delas utilizando unha destas claves:
- Para encriptación utilízase a clave pública
- Para desencriptción utilízase a clave privada
Algortimos de clave pública
- RSA
- Chamado así polos seus creadores (Rivest, Shamir e Adelman) é o máis antiguo e segue sendo o máis utilizado . Está baseado no problema de factorización de números primos moi grandes.
- ECC Elliptic Curve Cryptography
- Criptografía de curvas elípticas baseada nas matemáticas das curvas elípticas.
- DSA Digital Signature Algorithm
- Serve para firmar pero non para cifrar información. Moito menos rápido que RSA para sinatura dixital pero máis rápido para a verificación da sinatura.
| Algoritmo | Características | Ventaxas | Inconvintes |
|---|---|---|---|
| RSA | Seguridade baseada en factorización grandes números primos Número de iteracións: 16 Tipo Feistel |
Serve tanto para cifrado coma para sinatura dixital Moi rápido na verificación da sinatura |
Pouco eficiente en termos de velocidade de cifrado Inviable para uso con grandes volúmenes de datos Gran tamaño de clave (entre 512 y 4096 bits) Necesario un mecanismo de certificación para asegurar a veracidade da clave |
| ElGamal | Seguridade baseada en problema de logaritmo discreto | Serve tanto para cifrado coma para a sinatura dixital | Pouco eficiente en termos de velocidade de cifrado Inviable para uso con grandes volúmenes de datos |
| DSA | Seguridade baseada en problema de logaritmo discreto Utilización da función hash SHA-1 |
DSS é o estándar proposto para asinar dixitalmente | Non codifica Moi lento na verificación da sinatura Gran tamaño de clave (entre 512 y 1024 bits) |
| DH | Algoritmo de Intercambio de claves seguro Seguridade baseada en problema de logaritmo discreto |
Solo é necesario compartir dous números sobre unha canle insegura | Non asina nin cifra Non autentifica |
Diferenzas entre cifrado e encriptación
Cando falamos de encriptación, normalmente falase específícamente de cifrado. Máis hai outros tipos de métodos criptográficos ademáis do cifrado.
Nun sentido amplio, pódese considerar que o cálculo dunha función de hash é una operación de encriptación; non de cifrado. Como se comentou nos sistemas ben deseñados non se almacenan os valores dos contrasinais en claro, se non o resultado de aplicarlles unha función de hash. Para o propósito de verificar un contrasinal, o seu valor de hash serve perfectamente; pódese considerar que o almacenamento do valor de hash do contrasinal é un xeito de ocultar (encriptar) o seu valor.
Hai una diferencia fundamental entre o cálculo dun valor de hash e o cifrado: O cifrado é reversible (podese obter o valor en claro a partir do valor encriptado sempre que se coñeza a clave utilizada), e o cálculo dun valor de hash non o é (a partir dun valor de hash non se pode obter o valor orixinal).
Tanto as funcións de hash como as de cifrado son susceptibles de sufrir ataques criptográficos que poden ser por forza bruta e tamén cunha fase previa de criptoanálise. Para una función de hash o obxectivo é atopar unga colisión de hash para un valor determinado; para unha función de cifrado, o obxectivo é atopar a clave utilizada para l encriptación e con iso o texto en claro.
Comparativa e resumo
| Criptografía simétrica ou de clave secreta | |
|---|---|
| Puntos fortes | Cifran máis rápido que os algoritmos de clave pública. Serven habitualmente como base para os sistemas criptográficos baseados en hardware. |
| Puntos débiles | Requiren un sistema de distribución de claves moi seguro (se se coñece a clave pódense coñecer todos as mensaxes cifradas con ela). No momento en que a clave cae en manos non autorizadas todo o sistema deixa de funcionar; isto obriga a levar unha administración complexa. Se se asume que é precisa unha clave por cada parella de usuarios dunha rede, o número total de claves crece rápidamente co número de usuarios. |
| Criptografía asimétrica ou de clave pública | |
| Puntos fortes | Permiten conseguir autenticación e non repudio para moitos protocolos criptográficos. Adoitan empregarse en colaboración con calquiera dos outros métodos criptográficos. Permiten ter unha administración sinxela de claves ó non precisar de que haiba intercambio de claves seguro. |
| Puntos débiles | Son algoritmos máis lentos que os de clave secreta, co que non adoitan utilizarse para cifrar grandes cantidades de datos. As súas implementacións son comúnmente feitas en sistemas software. Para unha gran rede de usuarios e/ou máquinas precísase dun sistema de certificación da autenticidade das claves públicas. |
Como resumo, a criptografia xoga tres papeis principais na implementación de sistemas seguros:
- emprégase para manter o secreto e a integridade da información oonde queira que esta poida estar exposta a ataques
- como base para os mecanismos para autenticar a comunicación entre pares de principales (un principal pode ser un usuario ou un proceso)
- para implementar o mecanismo de firma dixital
Firma dixital
Certificados dixitais
Un certificado dixital é un documento que conten información utilizada para criptografía de clave pública e que permite acreditar a identidade do seu poseedor ou titular (quen pode ser unha persona ou unha entidade).
Un certificado dixital é análogo a un documento de identidade, que certifica a identidade dunha persona no mundo físico. Conten o nome do seu titular e a súa clave pública, ademáis dalgunha outra información.
Además, un certificado dixital está asinado digitalmente (contén unha sinatura dixital dos seus contenidos). Así conseguese:
- Garantir a súa integridade de xeito que o certificado queda invalidado se se lle fai calquer cambio posteriormente á súa creación e firma
- Identificar ó creador do certificado dixital. Isto é moi importante, xa que calquiera pode crear un certificado dixital coa información que desexe, utilizando ferramentas (coma openssl ou XXX); o único que pode garantir a corrección dos datos contidos nun certificado e que pertenzan á persona ou entidade é que esté asinado por un emisor de confianza.
E quén se considera que é un emisor de confianza de certificados dixitais? Unha autoridade certificadora ou AC (CA ou Certification Authority) é unha entidade que está facultada legalmente para emitir certificados dixitais. En España, por exemplo:
- O departamento Ceres da FNMT (Fábrica Nacional de Moneda y Timbre)
- Camerfirma Cualquier certicado digital rmado por una AC se considera de conanza.
- Moitos outros
Para poder validar a firma dixital dun certificado dixital emitido por una AC, precísase a clave pública desa AC.
Un certificado raíz (root certificate) é un certificado dixital especial que conten a clave pública dunha AC. Os certificados raíces adoitan vir instalados por defecto nun repositorio especial para certificados raíces do sistema operativo ou das aplicacións que os utilizan (Java, Navegadores, etc.).
No caso dos los navegadores web crease este repositorio durante o seu proceso de instalación, e se introducen nel os certificados raíces de diversas AC.
Os certificados raíces están asinados pola propia entidade certificadora, coa clave privada correspondente á mesma clave pública que conten, é dicir, son certificados autoasinados. En xeneral só se consideran de confianza os certificados autoasinados se son certificados raíces; e estos son os que están nun repositorio especial para certificados raíces do sistema operativo ou da aplicación que os utiliza.
Estructura dun certificado dixital X.509
X.509 eé un estándar que detalla a información que conteñen os certificados dixitais. Ten varias versións: e con cada nova versión engádese nova información (algunha dela opcional).
Cando o emisor (issuer) é o mesmo que o titular (subject), o certificado é autoasinado.
Os certificados autoasinados poden xenerarse de forma moi sinxela utilizando ferramentas (coma openssl ou XXX). Os certificados autoasinados non se consideran de confianza en xeneral, agás cando están instalados no sistema nun repositorio especial para certificados raíces emitidos por AC.
En canto ás extensións (extensions), cada unha ten:
- OID ou Object IDentifyier. Identifica a extensión de que se trata.
- Crítico ou non crítico. Se un sistema atopa un certificado cunha extensión crítica que non recoñece ou que non sabe manexar, debe rexeitalo.
- Valor da extensión. Pode conter non só valores simples, se non datos estruturados, dependendo da extensión.
Tipos de ficheiros para certificados dixitais
Existen varios tipos de ficheiros frecuentemente utilizados para gardar certificados dixitais X.509. Algúns deles permiten gardar outro tipo de información (coma por exemplo claves privadas). Cada tipo ten unha extensión distinta para os nomes de ficheiros.
Hai dúas posibles codificacións para os certificados X.509:
- der. É unha codificación binaria.
- pem. É unha codificación en forma de texto, con base 64/ASCII.
Estos ficheiros teñen esta forma:
-----BEGIN CERTIFICATE---- ...(Datos binarios codificados en base 64/ASCII) -----END CERTIFICATE----
Os tipos de ficheiros máis habituales son:
- cer, crt, der. Conteñen certificados X.509 estándares. Habitualmente, son ficheiros codificados coma der (en forma binaria) aínda que poderían vir tamén codificados coma pem (este é un formato de ficheiro de texto no que os datos binarios veñen codificados coma texto con base64, codificación esta para datos binarios moi utilizada en criptografía)
- p7b, p7c. Son formatos de ficheiro que conteñen tanto datos asinados coma os datos do certificado que se precisa para verificar a firma; mais é frecuente usar ficheiros deste tipo sen ningún dato asinado de xeito que conteñen só os datos do certificado
- pfx. Es un predecesor do formato p12.
- p12. Pode conter os datos dun certificado X.509 máis a clave privada. Se conten a clave privada, normalmente estará protexida por un contrasinal (a clave privada está encriptada con contrasinal, que será preciso para ober o valor da clave privada). Este mecanismo coñécese conoce coma PBE (Password Based Encription ou codificación baseada en contrasinal)
Infraestrutura de clave pública
Unha infraestructura de clave pública (PKI ou Public Key Infrastructure) é unha combinación de hardware, software, procedementos de seguridade e marco legal que, en conxunto, permite a execución con garantías de operacións criptográficas, cumplindo os requisitos de integridade, confidencialidade, autenticación e non repudio. Unha PKI permite establecer e xestionar asociacións entre claves públicas e identidades de personas e de organizacións.
A cuestión fundamental á que pretende dar respuesta unha PKI é se un certificado dixital é válido ou de confianza (se representa de feito á persona ou entidade que consta como titular no propio certificado).
Para dar por válido un certificado dixital, a súa firma dixital debe ser válida, e o seu emisor (issuer) de confianza. A primeira cuestión será determinar qué emisores son de confianza.
Por outra banda calquier emisor de certificados debe dispor dalgún mecanismo para revocar os seus certificados (conseguir que deixen de ser válidos antes do fin del periodo de validez especificado no propio certificado).
Autoridades certificadoras e autoridades de rexistro
As AC adoitan traballar con autoridades de rexistro ou AR (RA ou Registration Authority). Estas verifican a identidade das personas ou entidades que solicitan un certificado dixital a unha AC. Para iso normalmente requiren a presencia física da propia persona ou se se trata dunha organización, dun representante da organización que poida representala legalmente.
No caso de España, unha AC puede ser a FNMT, e unha AR pode ser a Agencia Tributaria.
Dado que unha AC pode asinar os certificados dixitais doutras AC, e estas a súa vez poden asinar os certificados dixitais doutras AC, establécese unha xerarquía de AC a partir de cada unha das AC que están no máis alto nivel. Estas son as autoridades raíz, e os certificados dixitais que emiten son certificados raíces e están autoasinados.
Validación de certificados
En última instancia, só as AC son de confianza. Os seus certificados (certificados raíces) son autoasinados. O seu emisor (issuer) é o mesmo titular (subject), que é a propia AC. Conteñen a clave pública da propia AC. A firma dixital que conteñen realizouse coa clave privada correspondente a esta clave pública; e por tanto, verifícase con ela mesma. Estos certificados están instalados no sistema nun repositorio especial para certificados raíces.
Calquer outro certificado autoasinado non se considera de confianza (xa que calquera pode xenerar un certificado autoasinado). Na práctica veremos como xenerar estes certificados autoasinados para programas de proba.
O resto dos certificados son certificados non autoasinados; o seu emisor (issuer) é distinto do seu titular (subject). A súa confianza ou validez será a que poida ter o seu emisor. Un certificado darase por válido:
- se existe un certificado para o seu emisor no sistema
- se a firma digital é correcta segúundo a clave pública do emisor
- se o certificado do emisor é a súa vez válido.
O problema redúcese a validar o certificado do seu emisor. Establécese así unha cadea de confianza de un certificado incial a un certificado raiz.
Revocación de certificados
Pode ser necesario invalidar ou revocar un certificado antes da data de fin de validez indicada no propio certificado:
- por petición do propio titular (por exemplo porque a clave privada perdeuse, ou sospeitase que foi comprometida e usada indebidamente ou copiada)
- por motivos jurídicos (por exemplo, que unha empresa deixe de existir)
- por fallos técnicos (un defecto en calquiera das fases do proceso de xeneración e distribución de certificados dixitais).
As listas de revocación de certificados (Certification Revocation Lists ou CRL) son un mecanismo mediante o cal a CA publica e distribúe información acerca dos certificados anulados ás aplicacións que os empregan.
Unha CRL é unha estrutura de datos asinada dixitalmente pola CA que contén a súa data e hora de publicación, unha identificación da entidade certificadora e os números de serie dos certificados anulados. Cando unha aplicación traballa cun certificado emitido por unha CA, debe obter a última CRL desa CA e comprobar que o seu número de serie non está incluido nela. Se non obtén esta información (ou a obtén pasado un plazo de tempo razonable) non debería dar por bo nin ese certificado nin ningún emitido por esa CA.
Outra forma de verificar a validez dos certificados é o protocolo OCSP (Online Certificate Status Protocol). Este protocolo adoita vir habilitado por defecto nas versións recentes dos principales navegadores.
A revocación de certificados é un dos puntos febles das PKI. Implica conexións con servidores para obter información acerca de certificados revocados, o que penaliza o rendemeento.
TLS / SSL
TLS (Transport Layer Security) é o nome máis actual de SSL (Secure Sockets Layer), pero o término antiguo SSL segue sendo ampliamente utilizado. Consiste nunha capa de seguridade que se pode engadir sobre o protocolo de nivel de transporte TCP. Utiliza métodos criptográficos de clave pública e de clave privada.
É posible engadir TLS sobre calquera protocolo xa existente engadindo unha fase inicial xusto después do establecemento da conexión de TCP, na que ambas partes acordan os protocolos criptográficos a utilizar e unha clave de sesión compartida. Polo demáis o protocolo xa existente non cambia, pero os datos que se transmiten nos paquetes de datos de TCP van encriptados. O protocolo resultante adoita chamarse igual que o original engadingo un S ó final. Exemplos:
- HTTPS é o resultado de utilizar TLS para que toda a información que transportan os paquetes de datos do protocolo de nivel de aplicación HTTP vaian encriptados.
- FTPS con respecto a FTP fai o mesmo
Para comprender. Os datos nas comunicacións en moitos protocolos viaxaban en claro. Isto sería o equivalente o envío dunha postal: o carteiro e calquera que manipule a postal pode ver o seu destinatario e o contido da mesma. TLS ven a supoñer o equivalente a un sobre: o carteiro xa non pode ver o contido de dentro do sobre, pero o que vai dentro pode ser unha postal idéntica a de antes.
Funcionamento
TLS utiliza criptografía de clave pública para acordar unha clave de sesión entre dous procesos unha vez establecida unha conexión de TCP. O resto das comunicacións encríptanse mediante criptografía de clave privada, utilizando esta clave de sesión.
De esta forma, TLS:
- Solventa os problemas que plantexa a compartición de claves coa criptografía de clave privada e a fai viable para a comunicación entre dúas partes que a priori non comparten ningunha clave. En canto se establece a conexión de TCP, xenérase sobre a marcha unha clave de sesión compartida para ambas partes.
- Aproveitase a maior rapidez da criptografía de clave privada. Esta é moito máis eficiente e consume menos potencia de cálculo que a de clave pública.
O proceso para o establecimiento dunha comunicación segura con TLS comeza unha vez que se estableceu unha conexión de TCP. Consta de dos procesos diferentes, pero que se solapan no intercambio de mensaxes entre cliente e servidor:
- Negociación ou handshake. Ambas partes acordan un cipher suite ou conxunto de algoritmos que utilizar. Un cipher suite inclúe:
- Un algoritmo para intercambio de claves e autenticación (baseado en criptografía de clave pública).
- Un algoritmo de encriptación de clave privada.
- Un sistema MAC (message authentication code). É un conxunto de varios algoritmos que permiten obter, a partir dunha mensaxe, un tag, que é unha breve secuencia de bytes que permiten verificar a integridade dunha mensaxe e ademáis autenticar o emisor; fai por tanto de firma dixital dunha mensaxe.
Cada nova versión engadíua novas cipher suites con mellores e algoritmos máis seguros, eliminabdo aqueles algoritmos considerados xa inseguros.
- Establecimiento dunha clave compartida de sesión. Esta clave utilizarase no sucesivo para cifrar a información mediante un algoritmo de clave simétrica. Na nova versión do protocolo TLS 1.3 introducíronse melloras para que sexan necesarias menos mensaxes de ida e volta entre cliente e servidor.
Túneles con SSH
O protocolo de nivel de aplicación SSH permite asegurar calquier protocolo de nivel de aplicación que funcione sobre o protocolo de nivel de transporte TCP mediante un mecanismo xenérico chamado tunnelling. Este utiliza TLS para encriptación de datos e é completamente transparente para as aplicacións de servidor e de cliente do protocolo (que seguen funcionando igual). O custe é que será preciso instalar e configurar un servidor SSH na máquina na que se executa a aplicación servidora e crear o túnel na máquina na que se executa a aplicación cliente.
Amosemos o funcionamento cun exemplo. Queremos utilizar SSH para asegurar as comunicacións dunha aplicación cliente que se executa na propia máquina cunha aplicación de servidor que funciona no porto 3300 dun host 140.14.61.114 onde está instalado e levantado un servidor de SSH, e existe un usuario pepe. Para crear un túnel desde o porto local (por exemplo, o 10300) a ese porto o comando sería:
ssh pepe@140.14.61.114 −L 10300:140.14.63.114:3300
Entón o programa cliente debe establecer unha conexión co porto local 10220 en lugar de co remoto 2200. O tráfico TCP que se dirixa hacia a conexión establecida con ese porto encriptarase e dirixirase a través do túnel SSH; e chegará ó servidor de SSH da máquina remota (normalmente, o porto 22). Alí se desencriptará e dirixirase o porto 2200.
Para reflexionar. A posibilidade de engadir unha capa de encriptación baseada en TLS/SSL sobre TCP (ben sexa na propia aplicación ou a nivel de sistemas) engadida mediante túneles de SSH fixo posible o uso do protocolo TCP para aplicaciones seguras. Pero... hay algo similar para UDP? Hai algunha solución coma o uso de DTLS ou UDP over TLS. Pero a propia natureza do protocolo (consistente no envío de paquetes individuales de datos e non orientada a conexión) fai moi pouco habitual precisar dun mecanismo similar.
Pódes atopar máis información sobre SSH:
- a nivel teórico neste artigo
- a nivel práctico neste artigo
Resumo
- A seguridade en comunicacións de datos entre procesos inclúe distintos aspectos complementarios que son importantes no caso común no que a comunicación entre emisor e receptor realizase a través dun medio de comunicación non seguro. Estes aspectos son:
- a integridade
- a confidencialidade
- a autenticación
- o non repudio
- Unha función de hash calcula a partir dunha secuencia de bytes de lonxitude arbitrariamente longa unha secuencia de lonxitude fixa. Debe cumprir os requisitos de:
- non reversibilidade
- uniformidade
- discontinuidade
- Na actualidade non se considera seguro para o seu uso en criptografía as funcións:
- MD5
- SHA-1
- O cifrado consiste en obter unha mensaxe cifrada (inintelixible para todo aquel que descoñezca a clave secreta) a partir dunha secuencia de bytes ou mensaxe en claro. A clave secreta permite obter a mensaxe en claro orixinal; porén, o cifrado é reversible.
- Tanto o cifrado dunha mensaxe coma o cálculo do seu valor de hash consideranse operacións criptográficas. O cifrado é reversible. Pola contra, o cálculo dun valor de hash non é reversible.
- Cando se obten un valor para o que unha función de hash obten un valor determinado prodúcese unha colisión de hash.
- Considérase unha función de hash robusta cando non é viable obter unha colisión de hash por forza bruta (probando un a un os posibles valores) e non existe ningún método de criptoanálise que permita seleccionar un conxunto máis reducido de valores cunha maior probabilidade de éxito.
- Do mesmo xeito, considérase un método de cifrado robusto cando non é viable obter o valor en blanco orixinal para un valor cifrado por forza bruta, e cando non existe ningún método de criptoanálise que permita seleccionar un conxunto máis reducido de valores cunha maior probabilidade de éxito.
- A criptografía de clave privada ou criptografía simétrica, basease no uso dunha mesma clave secreta por emisor para o encriptado de mensaxes e polo receptor para o seu desencriptado.
- A criptografía de clave pública ou criptografía asimétrica basease no uso dun par de claves, unha privada e outra pública, entre as que existe unha relación matemática.
- Coa clave pública pódese encriptar unha mensaxe de xeito que só se poderá desencriptar coa clave privada.
- Coa clave privada, xunto con unha función de hash, pódese calcular unha firma dixital, que só pode xerar o coñecedor da clave privada, pero que pode verificar calquer coñecedor da clave pública.
- Un certificado dixital X.509 conten a clave pública dunha persona ou entidade, e está asinado dixitalmente por unha AC; pódese utilizar para operacións de cifrado e para verificación de firma dixital.
- Unha PKI é unha combinación de hardware, software, procedimentos de seguridade e marco legal, que en conxunto permite a execución con garantías de operacións criptográficas, cumprindo os requisitos de integridade, confidencialidade, autenticación e non repudio. Unha PKI permite establecer e xestionar asociacións entre claves públicas e identidades de personas e de organizacións.
- Un certificado raíz é un emitido por unha AC, asinado por ela mesma (isto é, autoasinado), e que permite verificar a firma dos certificados dixitais emitidos por ella. Un certificado autoasinado só se considera válido se está emitido por unha AC.
- TLS/SSL utiliza unha combinación de técnicas criptográficas de clave pública e privada,e permite encriptar os datos transmitidos mediante o protocolo de transporte TCP.
Práctica
Glosario
- Ataque criptográfico
- Intento de atopar o texto en claro a partir do texto encriptado sen coñecer previamente a clave; tamén intento de obter unha colisión de hash para un valor de hash determinado.
- Autenticación
- Seguridade para o receptor dunha información de quén é o seu emisor.
- Certificado dixital
- Documento digital que conten información utilizada para criptografía de clave pública, e que permite acreditar a identidade do seu poseedor ou titular.
- Cifrado ou encriptación
- Representación dunha información dunha forma alternativa de xeito que sexa inintelixible; pero que se poida obter a información na súa forma orixinal se se coñece unha información secreta ou clave.
- Colisión de hash
- Hallazgo dunha secuencia de bytes para os que unha función de hash da como resultado un valor determinado.
- Confidencialidade
- Seguridade de que unha información transmitida hacia un receptor so é recibida por él (ou candomenos so é intelixible para él).
- Criptografía de clave privada
- Conxunto de métodos criptográficos, para encriptado (uo cifrado) e desencriptado (ou descifrado) de mensaxes, que se basean nunha clave ou secreto compartido entre emisor e receptor.
- Criptografía de clave pública
- Conxunto de métodos criptográficos que se basean nunha clave privada coñecida só por unha das partes, e unha clave pública asociada coñecida polas dúas. Inclúe métodos para encriptado (ou cifrado), desencriptado (ou descifrado) e firma dixital.
- Firma dixital
- Secuencia de bytes de lonxitude relativamente corta obtida a partir dunha secuencia de bytes, e que só pode calcular o coñecedor do valor dunha clave privada; pero que calquera pode, utilizando unha clave pública asociada con esa clave privada, verificar que foi xenerada por él.
- Función de hash
- Función que fai corresponder a unha secuencia de datos de lonxitude arbitrariamente longa unha secuencia de lonxitude fixa, e que cumple os requisitos de non reversibilidade, uniformidade e discontinuidade.
- Infraestrutura de clave pública (PKI)
- Combinación de medios e procedementos tecnolóxicos, administrativos e legales que, en conxunto, permiten a execución con garantías de operacións criptográficas baseadas en criptografía de clave pública, cumprindo os requisitos de integridade, confidencialidade, autenticación e non repudio.
- Integridade
- Seguridade para o receptor dunha información transmitida de emisor a receptor, a través dunha canle de comunicacións, de que esta no foi alterada na canle entre ambos.
- Non repudio
- Posibilidade de demostrar que unha información foi emitida por un emisor determinado.
- TLS/SSL
- Protocolo de seguridade que funciona a nivel de aplicación sobre o protocolo de transporte TCP; que utiliza unha combinación de métodos criptográficos de clave pública e privada; e que permite a encriptación dos datos transmitidos nos segmentos de datos do protocolo de transporte TCP.
- X.509
- Estándar para certificados dixitais.
Creditos e referencias
- Programación de servicios y procesos. Carlos Alberto Cortijo Bon ISBN: 9788413571041
- Plaza Martín, F. (2021). Manual de Criptografía: Fundamentos matemáticos de la Criptografía para un estudiante de Grado. Ediciones Universidad de Salamanca.
- Criptografía Simétrica y Asimétrica en la práctica. Luis Javier Marquina.