Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

Conceptes

Principi de Kerckhoffs: “L’efectivitat d’un sistema criptogràfic no ha de dependre que el seu disseny o algorisme romangui en secret, sinó que ha de basar-se exclusivament en el secret de la clau.”

Això implica que la seguretat d’un sistema depèn íntegrament de la protecció de la clau privada. Si aquesta clau es compromet, el sistema queda vulnerable independentment de la robustesa de l’algorisme.

Estats de les dades

En un sistema segur, quan una dada s’ha d’utilitzar (en ús) cal que sigui en pla. Però si està emmagatzemada o transmetent-se, cal mantenir-la secreta. Aquests són els estats:

  • En repòs: quan estan emmagatzemades digitalment en un dispositiu.
  • En trànsit: quan s’estan movent entre dispositius o punts de les xarxa.
  • En ús: quan una aplicació les està utilitzant, sense protecció.

Quan protegim les dades en repòs, preparem al nostre sistema per a l’eventualitat que es puguin llegir després d’un atac a la màquina on són. Quan protegim les dades en trànsit, ho fem perquè sabem que qualsevol pot escoltar el tràfic d’una xarxa.

Si s’exposen les nostres dades xifrades, i aconsegueixen accedir a les claus secretes associades (ja sigui al moment o més endavant), podran veure-les en pla.

De vegades podem evitar haver-les de guardar. Per exemple, si les podem demanar cada cop (p. ex. clau mestra), o bé comparar-les amb funcions hash (p. ex. contrasenyes).

Xifrat

La criptografia (del grec “kryptos” - amagat, secret - i “graphin” - escriptura. Per tant seria “escriptura oculta”) és l’estudi de formes de convertir informació des de la seva forma original cap a un codi incomprensible, de forma que sigui incomprensible pels que no coneguin aquesta tècnica.

En la terminologia de criptografia, trobem els següents elements:

  • La informació original que ha de protegir-se i que es denomina text en clar o text pla.
  • El xifrat és el procés de convertir el text pla en un text il·legible, anomenat text xifrat o criptograma.
  • Les claus són la base de la criptografia, i són cadenes de números amb propietats matemàtiques.

Existeixen dos grans grups d’algorismes de xifrat, en funció de si les claus són úniques o van en parella:

  • Simètrics: els algorismes que utilitzen una única clau privada per xifrar la informació i la mateixa per desxifrar-la. L’algorisme simètric més utilitzat és AES (Advanced Encryption Standard), amb claus de 128, 192 o 256 bits.
  • Asimètrics: els que tenen dues claus, una pública i una altra privada, que permet xifrar amb una qualsevol i desxifrar amb l’altra. S’utilitzen principalment per a dos propòsits:
    • Xifrat amb clau pública: un missatge xifrat amb clau pública només es pot desxifrar amb la clau privada.
    • Signatura digital: un missatge signat amb la clau privada pot ser verificat per qualsevol amb la clau pública.

La clau simètrica té inconvenients. Primer, necessites una clau per cada parella origen/destí. Segon, necessites una forma segura de compartir-les. La clau asimètrica té l’avantatge que pots compartir la part pública de la clau, ja que sense la part privada no pots fer res, però els algorismes són més lents i tenen limitacions en la mida del missatge a xifrar. Per exemple, RSA té un missatge màxim de floor(n/8)-11 bytes, on n és la mida de la clau en bits (p. ex. 2048).

El xifrat també pot ser de bloc o de stream:

  • Bloc: xifrat de blocs de mida fixa de dades. Poden ser asimètrics o simètrics.
  • Stream: xifrat d’un stream (corrent) de bits o bytes. Són simètrics.

Si no es diu el contrari, parlem només de xifrats en bloc.

Xifrat simètric: les dues parts comparteixen una clau privada

xifratpriv

Xifrat asimètric: només el propietari de les claus (el receptor) pot desxifrar les dades

xifratpubl

Intercanvi de claus

Com ja hem vist, el xifratge simètric té el problema de compartir la clau entre les dues parts. I l’asimètric, no permet xifrar blocs gaire grans.

La solució és utilitzar els dos tipus de xifrat de forma combinada.

  • La criptografia asimètrica ens permet compartir una clau privada de forma segura.
  • La criptografia simètrica ens permet xifrar missatges més llargs i més ràpidament.

L’intercanvi de clau més senzill es pot fer amb xifrat de clau pública RSA: una part xifra el secret compartit amb la clau pública de l’altra. El problema és que aquesta acció no proporciona Perfect Forward Secrecy (PFS): si algú obté la clau privada en el futur, i ha guardat la conversa xifrada, podria desxifrar-la.

rsaexchange

No obstant, l’algorisme més comú per fer intercanvi de clau és el Diffie-Hellman (DH), present en el preàmbul de la majoria de les comunicacions amb xifrat simètric. DH proporciona PFS perquè les claus es generen de forma efímera per a cada sessió i es descarten després.

diffiehellman

Per a dues parts A i B, el procés és el següent:

  • A i B generen dues parelles de claus pública/privada, Apub/Apri i Bpub/Bpri.
  • Les dues parts s’intercanvien les claus públiques Apub i Bpub.
  • En privat, cada part combina les claus públiques rebudes amb les privades (Apub+Bpri, Bpub+Apri). La característica essencial de DH és que aquesta combinació genera el mateix secret!

Resums de missatge

Un “message digest” o hash és una seqüència de bytes produïda quan un conjunt de dades passen per una funció hash. No és sempre necessària una clau perquè aquesta funció operi. Alguns algorismes coneguts: MD5, SHA-256. Les seves propietats són:

  1. És determinista (el mateix resultat per la mateixa entrada).
  2. És ràpida.
  3. La funció inversa no és viable.
  4. Un petit canvi d’entrada provoca un gran canvi de sortida.
  5. Dues entrades diferents no poden tenir el mateix hash.

Un resum ens permet protegir la integritat d’un missatge.

Veiem com funciona SHA-256 a Linux sobre un petit text “hello world!”. Si ho proveu, veureu que el resultat és instantani (2). Com que té 256 bits, genera un resum de 32 bytes (en hex). Mireu com, canviar un caràcter, canvia totalment el hash (4).

$ echo 'hello world!' | openssl sha256 (stdin)= ecf701f727d9e2d77c4aa49ac6fbbcc997278aca010bddeeb961c10cf54d435a $ echo 'hello,world!' | openssl sha256 (stdin)= 4c4b3456b6fb52e6422fc2d1b4b35da2afbb4f44d737bb5fc98be6db7962073f

Si busqueu el resum de “hello world!” o el de “123456” el trobareu a la xarxa. Dues conclusions: per a un algorisme i una entrada, tenim la mateixa sortida (1). No tenim la funció inversa (3), però hi ha rainbow tables (taules precalculades de resums) que fan la correspondència entre textos comuns i els seus resums, i que s’utilitzen per esbrinar credencials.

Si volem protegir la integritat i l’autenticitat, podem utilitzar els MAC (message authentication code). Bàsicament, es tracta de resums segurs xifrats amb una clau privada que cal compartir entre les dues parts per tal de verificar la comunicació.

hmac

També tenim les Key Derivation Functions (KDF), una hash que permet derivar un o més secrets a partir d’un altre més petit, com un password. Les KDF permeten estendre claus (key stretching) en altres més llargues. A més, les KDF afegeixen un salt (valor aleatori únic per cada entrada) per evitar atacs amb rainbow tables, ja que el mateix password amb diferent salt genera resums completament diferents. Exemples de KDF: bcrypt, scrypt, Argon2.

En el següent diagrama es poden veure dos usos de les KDF:

  • Per a guardar un hash d’una contrasenya, i poder comprovar si s’introdueix correctament.
  • Per a generar claus d’algorismes simètrics a partir d’una contrasenya.

kdf

Signatures digitals

La signatura digital és un mecanisme de xifrat per autentificar informació digital. El mecanisme utilitzat és la criptografia de clau pública. Per això aquest tipus de signatura també rep el nom de signatura digital de clau pública. S’utilitzen per a garantir tres aspectes: autenticitat, integritat i no repudi. Juntament amb el xifrat, que garanteix la confidencialitat, aquests són els objectius fonamentals de la seguretat de la informació.

Aquest és el procés per a obtenir una signatura digital:

  1. Es calcula un resum de missatge per a les dades d’entrada.
  2. El resum es xifra amb la clau privada.

Aquest és el procés per a verificar una signatura digital:

  1. Es calcula un resum de missatge per a les dades d’entrada.
  2. El resum de la signatura digital es desxifra amb la clau pública.
  3. Es comparen els dos resums. Si són iguals, la signatura és correcta.

Signatura digital: el propietari de les claus (l’emissor) envia la prova de les dades originals

signatura

Autenticació

L’autenticació és el procés de confirmar l’autenticitat reclamada per una entitat. Tenim bàsicament dos tipus:

  • Autenticació de dades: les dades no han estat modificades. Es pot aconseguir amb un algorisme de resum de missatge (message digest).
  • Autenticació d’autor: l’autor és qui diu ser. Es pot aconseguir amb un protocol de desafiament-resposta (challenge-response).

L’autenticació no vol dir que tinguem xifratge.

Autenticació de dades

Prova que les dades no han estat alterades. Com hem vist a les seccions anteriors, hi ha tres nivells:

  • Hash / resum de missatge: garanteix només la integritat (qualsevol modificació de les dades canvia el hash, però qualsevol persona pot calcular-lo, així que no prova qui l’ha generat).
  • MAC / HMAC: garanteix integritat + autenticació (només qui té la clau secreta compartida pot generar un MAC vàlid, però com que la clau és compartida, qualsevol de les dues parts podria haver-lo creat, i per tant no hi ha no repudi).
  • Signatura digital: garanteix integritat + autenticació + no repudi (només el propietari de la clau privada pot signar, i com que ningú més la té, no pot negar haver-ho fet).

Autenticació d’autor

Prova que l’altra part és qui diu ser. L’autenticació es basa en tres factors clàssics: alguna cosa que saps (contrasenya), alguna cosa que tens (certificat, smart card, token) i alguna cosa que ets (biometria). L’autenticació multifactor (MFA) combina dos o més d’aquests factors.

En l’àmbit criptogràfic, el mecanisme principal és el protocol de desafiament-resposta (challenge-response), basat en el factor “alguna cosa que tens” (la clau privada). Prova que l’altra part posseeix aquesta clau sense revelar-la:

  1. El verificador envia un desafiament (un valor aleatori o nonce) a l’entitat que vol autenticar.
  2. L’entitat respon amb una prova que demostra que posseeix la clau privada.

Hi ha dues variants:

  • Desxifrar un desafiament: el verificador xifra el nonce amb la clau pública de l’entitat. L’entitat demostra la seva identitat desxifrant-lo amb la seva clau privada.
  • Signar un desafiament: l’entitat signa el nonce amb la seva clau privada. El verificador comprova la signatura amb la clau pública.

Certificats

Si se signa un document digital utilitzant una clau privada, el receptor ha de tenir la clau pública per verificar la signatura. El problema és que una clau no indica a qui pertany. Els certificats resolen aquest problema: una entitat ben coneguda (Certificate Authority: CA) verifica la propietat de la clau pública que se t’ha enviat.

Un certificat conté:

  1. El nom de l’entitat per qui s’ha emès el certificat.
  2. La clau pública d’aquesta entitat.
  3. La signatura digital que verifica la informació en el certificat, feta amb la clau privada de l’emissor.

Un certificat podria contenir aquesta informació:

"L'autoritat de certificació 2276172 certifica que la clau pública de John Doe és 217126371812".

Problema: per verificar un certificat, necessitem la clau pública de la CA que l’ha signat. Però, qui garanteix que aquesta CA és legítima? Una altra CA de nivell superior pot haver signat el seu certificat, formant una cadena de certificats. Al final de la cadena hi ha un certificat arrel (root certificate), que està autosignat — és a dir, signat per la mateixa CA que l’emet. Com que no hi ha cap autoritat superior que el validi, hem de decidir confiar-hi explícitament. Per això, els navegadors i plataformes com Java inclouen una llista preinstal·lada de CA arrel considerades confiables.

Els certificats s’utilitzen en molts contextos: servidors web (TLS/SSL), signatura de codi, correu electrònic (S/MIME), autenticació de clients, etc. El més comú és el certificat de servidor TLS/SSL, que permet al navegador verificar que es connecta al servidor legítim. El client utilitza l’algorisme de validació del camí de certificació:

  1. El subject (CN) del certificat coincideix amb el domini al qual es connecta.
  2. El certificat l’ha signat un CA confiable.

Comunicació segura TLS

El handshake TLS és l’exemple més comú de com tots els conceptes anteriors treballen junts: certificats per identificar el servidor, signatures digitals per verificar la confiança, i intercanvi de claus per establir un canal xifrat.

Handshake TLS 1.2 simplificat (intercanvi RSA):

  1. El navegador es connecta al servidor i rep el seu certificat (que conté la clau pública del servidor).
  2. El navegador verifica el certificat: comprova que la signatura prové d’una CA confiable i que el domini coincideix.
  3. El navegador genera un secret aleatori, el xifra amb la clau pública del servidor i l’envia. Només el servidor pot desxifrar-lo (xifrat asimètric). Això és un desafiament-resposta per desxifrat: el servidor demostra la seva identitat perquè és l’únic que pot desxifrar el secret.
  4. Ambdues parts utilitzen el secret compartit com a llavor per derivar les claus de sessió (simètriques) mitjançant una funció de derivació de claus (KDF).
  5. A partir d’aquest moment, tota la comunicació utilitza xifrat simètric amb les claus compartides.

Handshake TLS 1.3 simplificat (ECDHE):

En TLS 1.3, l’intercanvi de clau RSA s’elimina i s’utilitza exclusivament Diffie-Hellman efímer (ECDHE), garantint Perfect Forward Secrecy. Però com que DH no autentica les parts, el servidor ha de demostrar la seva identitat d’una altra manera:

  1. Client i servidor fan un intercanvi de claus Diffie-Hellman per generar un secret compartit.
  2. El servidor signa la seva clau pública DH amb la seva clau privada del certificat, provant que els valors de l’intercanvi realment provenen d’ell i no d’un atacant. Això és un desafiament-resposta per signatura: el client verifica la signatura amb la clau pública del certificat.
  3. Tota la comunicació utilitza xifrat simètric amb les claus derivades del secret compartit.