Hash
Funciones Hash
● Una función de hash H(M) toma un mensaje de cualquier
tamaño M y retorna un valor de largo fijo h.
● h = H(M)
Además debe ser no reversible:
● Dado M, es fácil calcular h.
● Dado h, es difícil encontrar un M tal que H(M) = h.
● Dado M, es difícil encontrar otro mensaje M’ tal que H(M) =
H(M’).
● Y debe ser resistente a colisiones:
○ Es difícil encontrar dos mensajes aleatorios, M y M’ tal
que H(M) = H(M’).
2
Problema del cumpleaños
● ¿Cuál es la probabilidad que una persona tenga la misma
fecha de cumpleaños que uno?
○ p = 1/365
● Si tengo n personas. ¿Cuántos pares distintos de personas
puede generar?
○ n*(n−1)/2
● La probabilidad que al menos dos personas tengan el mismo
día de cumpleaños.
○ 1 − (1 − 1/365 ) ^ (n*(n−1)/2)
3
Gráficamente...
4
Estadísticas
Info entre 1973 y 1999
¿Cuál es la distribución?
¿Cuál es la moda?
¿Qué ocurrió hace 9 meses?
5
¿Hay diferencias en la actualidad?
6
Estadísticas por latitud
7
Crimen Perfecto
1. Tener cheques electrónicos.
2. Generar 2 cheques electrónicos con el mismo hash.
3. Firmar el cheque de menos valor.
4. Usar firma digital anterior en el cheque de mayor valor.
8
Ataques a funciones hash
Pre-image attack: Crea un mensaje con el mismo hash
Collision attack: Encuentra 2 mensajes con el mismo hash
9
Funciones hash
● ¿Cuál debería ser el largo del resultado de una función de
hash?
● 64 bits es demasiado poco para resistir ataques.
● La mayoría de las funciones de hash existentes producen
valores de 128 bits.
● NIST especifica valores de hash de 160 bits para su
estándar.
10
Código de Redundancia Cíclica
● Utilizado para verificar la integridad de los datos de una
transmisión.
● El CRC de 32 bits tiene actualmente un uso muy extendido
● Este código se basa en el principio de que n bits de datos se
pueden considerar como los coeficientes de un polinomio.
Por ejemplo, los datos 1101 pueden tratarse como el
polinomio x3 + x2 + 1.
11
Procedimiento
● Se añaden r bits 0s a la derecha del mensaje (tantos ceros
como grado tenga el polinomio generador).
● Se divide el polinomio obtenido por el polinomio generador.
● La elección del polinomio generador es esencial si
queremos detectar la mayoría de los errores que ocurran.
● Al comprobar el CRC, sólo si el residuo de división es cero,
entonces la comunicación estará libre de errores.
12
Polinomios generadores
Polinomio generador CRC-16
x16 + x12 + x5 + 1
Polinomio generador CRC-32
x32+x26+x23+x22+x16+x12+x11+x10+x8+x7+x5+x4+x2+x+1
13
Compressed files
14
Pasos
15
Step by step
[Link]
[Link]
lation/[Link]?Polynom=100&Message=1234
[Link]
[Link]
[Link]
16
¿Hay colisiones?
17
Complemento a uno
[Link]
[Link]
18
Lan Manager (LM) / NTLM
● La contraseña se rellena con ceros o se trunca a 14 caracteres
● Se divide en dos mitades de 7 caracteres
● Se convierten en una cadena binaria para usar como dos claves
DES, insertando un cero después de cada 7 bits
● Cada clave se utiliza para cifrar la cadena KGS!@#$%
● Los dos textos cifrados resultantes se concatenan para formar el
hash LM de 16 bytes.
[Link]
m-net-ntlmv2-oh-my-a9b235c58ed4
19
MD2
● Es una función de hash criptográfica desarrollada por
Ronald Rivest en 1989 definida en la RFC 1319.
● El algoritmo está optimizado para computadoras de 8 bits.
● El valor hash de cualquier mensaje se forma haciendo que
el mensaje sea múltiplo de la longitud de bloque en el
ordenador y añadiendo un checksum.
● La longitud del resumen es de 128 bits.
● En Marzo del 2011, queda obsoleto según la RFC 6149
20
MD4
● Desarrollado en 1990
● La longitud del resumen es de 128 bits.
● El algoritmo está optimizado para computadoras de 32 bits.
● En 1995 se demostró que se podían generar colisiones en
unos pocos segundos.
● En Marzo del 2011, queda obsoleto según la RFC 6150
21
Muerto en vida...
[Link]
-[Link]
22
MD5
● Publicado en 1992 por la RFC 1321
● MD5 procesa el mensaje en bloques de 512 bits que se
dividen en 16 sub-bloques de 32 bits c/u.
● El resultado son 4 números de 32 bits que se concatenan
para entregar el valor de hash de 128 bits.
● El mensaje original se expande para tener un largo múltiplo
de 512 bits menos 64.
● El relleno es un bit en 1 seguido de bits en 0.
● Al final se agregan 64 bits que representan el largo del
mensaje, lo que deja el largo en un múltiplo de 512 bits.
23
Añadiendo bits
● Se añade un bit ‘1’ y luego tantos bits ‘0’ como sean
necesarios para cumplir la condición.
● Condición: (M + Relleno) mod 512 = 448
● Recordar trailer de 64 bits
● Se debe añadir desde 1 a 512 bits de relleno.
24
Longitud del mensaje
● Antes del paso anterior se genera una representación de 64
bits correspondientes al largo del mensaje original ‘M’.
● Esta es agregada al final del bloque.
● Ahora tenemos un bloque que es múltiplo exacto de 512
bits.
● De otra forma, tenemos 16 palabras de 32 bits cada una.
25
Inicializando el buffer
Se crea un buffer de 4 registros de 32 bits cada uno, y se
representan como A, B, C y D en formato hexadecimal.
A = 0x01234567
B = 0x89abcdef
C = 0xfedcba98
D = 0x76543210
26
Procesando el mensaje
Se definen 4 funciones auxiliares, F, G, H e I.
Cada función tiene 3 entradas de 32 bits, X, Y y Z.
La salida de estas funciones es una palabra de 32 bits.
Las cuatro funciones no-lineales son:
27
al fin terminamos!!
● Al finalizar los ciclos, quedan en los buffer A, B, C y D el
resultado final del proceso.
● Como los buffer son de 32 bits cada uno, entonces
obtenemos el Hash de 128 bits del mensaje ‘M’.
28
¿y el mono?
29
Efecto Avalancha
Incluso un cambio pequeño en el mensaje, nos entrega un
mensaje totalmente distinto.
30
MD5 en PHP
<?php
$password="hola";
$password = md5 ( $password );
echo $password;
// Imprime 4d186321c1a7f0f354b297e8914ab240
?>
31
¿Es seguro?
● En 2004 se demostró la capacidad práctica para que un
atacante genere colisiones.
● En 2005 se demostró la capacidad para que un atacante
genere certificados X.509 con colisión.
● Desde el 2008, Software Engineering Institute recomienda
no utilizar el algoritmo MD5.
[Link]
32
Estado actual
● En Diciembre de 2010 se publicó la primera colisión de un
bloque simple (512 bits).
● Al que encuentre una colisión para un mensaje de 64 bytes
diferente a la publicada antes del 1 de Enero de 2013 se le
pagarán US$10.000.
En Marzo de 2011 se publicó la RFC 6151 con consideraciones
para actualización de la seguridad en MD5.
[Link]
33
Single-block collision for MD5
Y aquí está el código...
34
2 Images, one MD5 Hash with HashClash
[Link]
[Link] 35
MD5 Collision
36
¿Dónde lo podemos ver aún?
37
¿Qué y cómo calcular?
38
SHA (Secure Hash Algorithm)
● En 1993, la NIST, junto a la National Security Agency,
basándose en MD5, propuso la función hash llamada SHA
(Secure Hash Algorithm).
● En 1995, el mismo NIST introdujo una modificación a SHA,
afirmando que lo hacía menos débil. La antigua versión pasó
a llamarse SHA-0 y la nueva versión SHA-1.
● La versión SHA-1 constituye un estándar para el gobierno de
los [Link]
39
¿Cómo funciona?
● Tiene 5 variables en lugar de 4.
● Luego, genera un hash de 160 bits en lugar de 128.
● Esto hace que sea mucho más resistente ante un ataque de
fuerza bruta.
● Es más lento.
40
¿Alguna diferencia?
● Los hash generados no son texto plano, sino un conjunto
arbitrario de bits, eso sí, de longitud fija.
● Para guardarlos en una base de datos, se transforman a
BASE64 (que sí son caracteres ASCII).
41
Cálculo de SHA
El proceso para calcular el hash se hace igual que MD5:
Se añade un 1, después los ceros necesarios hasta que sólo
falten 64 bits para que el mensaje sea múltiplo de 512, y por
último la longitud del mensaje antes del rellenado en formato
de 64 bits.
42
Inicializando el buffer
Se inicializan cinco constantes de 32 bits cada una:
A = 0x 67 45 23 01
B = 0x EF CD AB 89
C = 0x 98 BA DC FE
D = 0x 10 32 54 76
E = 0x C3 D2 E1 F0
43
Words
El bloque de 512 bits pasa de estar formado por 16 palabras
de 32 bits (M0 . . .M15) a estarlo por 80 (W0 . . .W79) aplicando
las siguientes operaciones:
Wt = Mt , para t entre 0 y 15
Wt = (Wt -3 XOR Wt -8 XOR Wt -14 XOR Wt -16) <<< 1, para t
entre 16 y 79.
(La operación <<< n es un desplazamiento circular a la
izquierda de n bits).
44
Funciones
Cada operación es una función no lineal, utilizando cada una
tres de las variables como entrada, y son:
Ft (X, Y, Z) = (X AND Y) OR ((NOT X) AND Z), para t entre 0 y 19.
Ft (X, Y, Z) = X XOR Y XOR Z, para t entre 20 y 39 y entre 60 y 79.
Ft (X, Y, Z) = (X AND Y) OR (X AND Z) OR (Y AND Z), para t entre 40 y 59.
45
Constantes
También se utilizan cuatro constantes:
Kt = 0x5a827999, para t entre 0 y 19
Kt = 0x6ed9eba1, para t entre 20 y 39.
Kt = 0x8f1bbcdc, para t entre 40 y 59.
Kt = 0xca62c1d6, para t entre 60 y 79.
46
Diagrama
47
Efecto Avalancha
Incluso un cambio pequeño en el mensaje, nos entrega un
mensaje totalmente distinto.
48
Better than MD5
Iguales para MD5, diferentes para SHA1
49
SHA-1
Cabe destacar que en 2005 se rompió el algoritmo SHA-1 de
forma teórica y en 2017, académicos de Google, consiguieron
el primer ataque de colisión SHA-1 exitoso del mundo,
conocido como «SHAttered».
Esta hazaña costó USD$110.000.
[Link]
[Link]
50
SHA-1
● Todos los ataques prácticos en MD5 son ahora también
prácticos en SHA-1.
● Basta arrendar 900 GPUs (Nvidia GTX 1060) por 2 meses
● Menos de 100 mil dólares.
[Link]
51
LinkedIn’s salted double-hashed
[Link]
crack-your-own-linkedin-password-hash/
52
RIPEMD-160
RIPEMD-160 (RACE Integrity Primitives Evaluation Message
Digest, primitivas de integridad del resumen del mensaje), fue
desarrollado en Europa y publicado primeramente en 1996.
Fue diseñado en la comunidad académica abierta, en
contraste con el algoritmo SHA-1, diseñado por la Agencia de
Seguridad Nacional estadounidense (NSA).
[Link]
53
Variaciones SHA-2
● SHA-256:
○ 8 bloques de 32 bits
● SHA-384
○ valor de inicio es diferente
● SHA-512
○ 8 bloques de 64 bits
¿Por qué en la práctica SHA no reemplazó a MD5?
● Principalmente por la falta de compatibilidad con sistemas
Windows XP SP2 o anteriores.
54
ISO/IEC 10118-3:2003
Dedicated hash-functions
● RIPEMD-160
● RIPEMD-128
● SHA-1
● SHA-256
● SHA-512
● SHA-384
● WHIRLPOOL
Para cada una de estas 7 funciones hash, ISO/IEC 10118-3:2003
especifica un método de padding, valores de inicialización,
parámetros, secuencias de funciones a utilizar en las rondas,
constantes; y entrega múltiples ejemplos de cómputo.
[Link]
55
New SHA-512 versions (2011)
SHA-512/224 y SHA-512/256 truncan a 224 y 256 bits el
SHA-512 con un nuevo IV (Initialization Vector). Lo han hecho
porque SHA-512 es más rápido que SHA-256 en las CPU de
64 bits, por lo que estas nuevas variantes de SHA son más
rápidas.
[Link]
1/02/nist_defines_ne.html 56
OpenSSL speed
57
[Link]
¿Dificultad de implementar?
>>> from [Link] import SHA256
>>> m = [Link]()
>>> [Link](’abc’)
>>> [Link]()
’ba7816bf8f01cfea414140de5dae2223b00361a396177a9cb410ff61f20015ad’
58
Benchmark MD5 vs SHA
El benchmark Hashcat se generó utilizando un procesador
Intel i5 4950 con 4 núcleos. Los resultados de cudaHashcat
se generaron con una tarjeta gráfica NVIDIA Geforce GTX
560.
UPDATE: Con una GTX 980 se obtienen 12.7 billones de
hash MD5 por segundo.
[Link]
59
¿Dónde encuentro MD5 & SHA2?
60
SHA for Intel
La extensión SHA para x86 en Intel fue introducida en 2013
con la arquitectura Goldmont para un “budget-friendly” (aka
mediocre performance) permitiendo a los procesadores
Pentium y Celeron calcular rápidamente la rondas SHA-1 y
SHA-256.
[Link]
bring-sha-extensions-to-intels-cpus/ 61
62
List of possible hashes
63
Hashcat online
[Link]
cat/blob/master/[Link]?authuser=1
64
SHA-3
NIST hace un llamado el 2 de Noviembre de 2007.
Los requerimientos mínimos son:
● Hashes de 224, 256, 384, 512 bits
● Máximo tamaño del mensaje de 264 - 1 bits
Puntos a considerar:
● Costo de la implementación en hardware
● Velocidad de la implementación
● Energía requerida para generar el hash
65
Seleccionados SHA-3
Final round:
● BLAKE
● Grøstl
● JH
● Keccak
● Skein
66
Benchmark
Prueba se realizada en Ubuntu 10.10 de 64 bits que ejecuta
PHP 5.3.3-1ubuntu9.3 en modo CLI. La CPU es un Intel Core2
Duo T9300 @ 2.50GHz y la máquina tiene 4 GB RAM. Durante
toda la duración de la prueba, el uso de la CPU alcanzó un
máximo del 85% y el uso de la memoria alcanzó un máximo
del 25%.
67
SHA-3
Keccak es el algoritmo ganador y está disponible en
[Link]
Oficialmente, NIST aprueba su uso desde el 5 de Agosto de
2015 para protección de información sensible.
[Link] 68
Hash Generator
[Link]
69
Blake3 (2020)
[Link]
yptographic_hash_functions 70
Authentication Protocol Algorithms
MAC - Message Authentication Code (integridad + autenticación)
[Link]
ty-4/[Link]
71
Length extension attack
Un ataque de extensión de longitud es un tipo de ataque en el
que un atacante puede utilizar Hash(mensaje1) y la longitud
del mensaje1 para calcular Hash(mensaje1, mensaje2) para
un mensaje controlado por el atacante, sin necesidad de
conocer el contenido del mensaje1. Algoritmos como MD5,
SHA-1 y SHA-2 que están basados en la construcción de
Merkle-Damgård son susceptibles a este tipo de ataque. El
algoritmo SHA-3 no es susceptible.
[Link]
[Link]
[Link]
72
Demo Extension Attacks
[Link]
[Link]
[Link]
[Link]
[Link]
[Link]
n-attack-python/
[Link]
73
HMAC vs MAC
MAC es susceptible a ataques de extensión de longitud.
No se conocen ataques de extensión contra la especificación
actual del HMAC.
HMAC - Hash-Based Message Authentication Code
sha256('thisIsASe' + sha256('cretKey1234' + 'my message
here'))
74
HMAC (Hash-based message
authentication code)
RFC 2104
La fuerza criptográfica del HMAC depende de la potencia
criptográfica de la función de hash subyacente, el tamaño de
su salida de hash y el tamaño y calidad de la llave.
HMAC-SHA1 y HMAC-MD5 se utilizan dentro de los
protocolos IPsec y TLS.
75
HMAC-SHA1
ipad es el inner padding (0x363636…3636)
opad es el outer padding (0x5c5c5c…5c5c)
[Link] 76
HMAC Generator
77
HOTP (HMAC OTP)
RFC 4226
HMAC(K,m) = H(K ⊕ 0x5c5c… | H(K ⊕ 0x3636… | m))
HOTP(K,m) = Truncate(HMAC(K,m)) & 0x7FFFFFFF
Por lo general se usa un valor HOTP de 6 a 8 dígitos,
dependiendo de la implementación.
HOTP-Value = HOTP(K,m) mod 10d, donde d es la cantidad
de dígitos.
[Link] 78
Challenge-Response Authentication Mechanism
CRAM-MD5 está basado en HMAC-MD5. Le da soporte a
Simple Authentication and Security Layer (SASL), que es
usando en la autenticación de protocolos como SMTP, POP,
IMAP, LDAP, XMPP, BEEP, y otros.
La RFC2831 hace referencia al uso de autenticación
mediante digest como mecanismo SASL.
Se utiliza para evitar el envío de contraseñas en texto plano,
pero es menos efectivo que el uso de conexiones cifradas.
79
CRAM-MD5 Challenge
El servidor envía una cadena en base64 al cliente.
El cliente convierte la cadena a hexadecimal y calcula
HMAC-MD5 sobre el mensaje, a partir de la contraseña del
usuario. Luego concatena el nombre de usuario y un espacio
al mensaje. Finalmente, convierte todo a base64 y se le envía
el mensaje al server.
El servidor utiliza el mismo método para calcular la respuesta
esperada. Si la respuesta dada y la respuesta esperada
coinciden, la autenticación se ha realizado con éxito.
80
DIGEST-MD5 vs CRAM-MD5
DIGEST-MD5 es muy similar a CRAM-MD5, pero es algo más fuerte
porque CRAM-MD5 sólo incluye datos aleatorios del servidor mientras
que DIGEST-MD5 incluye datos aleatorios tanto del cliente como del
servidor.
DIGEST-MD5 también proporciona una disposición para garantizar la
integridad y/o confidencialidad de la conexión, que CRAM-MD5 no
ofrece.
81
Authentication Protocols
● OAuth
● OAuth 2.0
● OpenID
● OpenID Connect
● LDAP Authentication
● Kerberos
● DIGEST-MD5
● GSSAPI
● SASL
● SAML
● Java Authentication and Authorization Service (JAAS)
● NMAS
● FIDO
[Link]
82
CPU vs GPU
83
Blowfish crypt
Por lo general los algoritmos
pueden correr hasta 100 veces
más rápidos en GPU vs CPU,
pero hay casos, como bcrypt, que
son iguales o más lentos en GPU
vs CPU.
84
Why slow computer speed is better?
Ejemplos de estos algoritmos incluyen BCrypt, SCrypt,
Argon2, PBKDF2 y otros. Estos algoritmos están
específicamente diseñados para hacer que la CPU/GPU del
computador tome una cantidad excesiva de tiempo generando
un solo hash.
Al ralentizar el cálculo del hash, aumenta el tiempo de uso del
equipo Bitcoin de 4 minutos a 320.300 años. En esta
comparación se puede ver la diferencia práctica entre el uso
de SHA-2 y BCrypt.
[Link]
-may-save-your-cpu-and-your-sanity-806733765b27 85
Bcrypt
go get -u [Link]/bitnami/bcrypt-cli
echo -n supersecret | bcrypt-cli
86
Sazonando la seguridad
Desde el 2017, NIST recomienda utilizar un input secreto
(pepper) cuando se almacenan passwords.
Se guarda por separado en algún otro
medio, como un módulo de seguridad de
hardware.
87
Bcrypt acronym
$2a$ [Link]
$2y$ (2011) [Link]
$2b$ (2014) [Link]
[Link]
re-2x-prefix-are-used-in-bcrypt 88
Bcrypt + salt generator
89
Bcrypt in PHP
[Link]
06122ca9c328a83b43b3c0e51736e347d54db 90
Cómputo exponencial
91
*-crypt algorithms
● sha512 (función hash de uso
general) y sha512crypt (función
de hash para password basada
en sha512).
● sha512crypt usa 5000 rondas
por defecto
[Link]
92
Key Derivation Function
Toma una password y
genera n bits que
pueden ser usados
como una llave de
cifrado.
93
Key Derivation Functions
● Key Stretching (rounds)
● Key Separation (sub-keys)
● Key Strengthening (salt)
94
How to crack bcrypt efficiently
[Link]
[Link]
[Link]
95
History
96
Scrypt
Scrypt es otro algoritmo de hash que tiene las mismas
propiedades que bcrypt, excepto que cuando se aumentan las
rondas, aumenta exponencialmente el tiempo de cálculo y el
espacio de memoria necesario para generar el hash.
Scrypt se creó como respuesta a la evolución de los ataques
a bcrypt y es completamente inviable cuando se utilizan
FPGAs o GPUs debido a las limitaciones de memoria.
97
Bcrypt vs Argon2
Argon2 ofrece una mejor protección frente a ataques Time
Memory Trade-Off (TMTO) y una mejor protección de side
channel.
[Link]
98
Argon2
99
PBKDF2 año 2000 vs 2017
Public Key Cryptography Standards (PKCS)
PKCS #5: Password-Based Cryptography Specification
Version 2.0 vs 2.1
● RFC 2898
● RFC 8018
[Link]
100
Lista de implementaciones
101
NPM Trends
102
PBKDF2
103
Hashing Passwords
Los algoritmos más recomendados son:
● Bcrypt
● Scrypt
● Argon2
● PBKDF2
104
105
Argon2
Ganador de la competición de hashing de contraseñas (PHC)
en 2015. Argon2 se basa en AES y tiene dos versiones
principales:
● Argon2i que es la opción más segura contra los ataques de
canal lateral, que permiten leer la memoria privada de otros
procesos que se ejecutan en el mismo hardware a través
de canales laterales basados en la caché
● Argon2d, que es la opción más segura contra los ataques
de cracking en la GPU.
[Link]
106
Hash for IoT
BLAKE2s ha ganado terreno en el último tiempo, uno de los
subcampeones de SHA-3, que a menudo se prefiere al
verdadero ganador de SHA-3 debido a su rendimiento.
Además, en ISO/IEC 29192-5:2016 se especifican tres
funciones hash adecuadas para aplicaciones que requieren
implementaciones criptográficas ligeras: PHOTON,
SPONGENT y Lesamnta-LW.
[Link]
107
Infraestructura
108
Light Weight Cryptography environment
SHAKE proporciona un excelente recurso, es eficiente con el
consumo de energía, ya que no requiere grandes recursos
físicos ni lógicos.
SHAKE es definido como una extendable-output functions
(XOFs).
[Link]
-stirs-up-crypto-7d87f3cf39f4 109
Shake
110
Security strengths
111
Lookup table / rainbow table
Son tablas formadas por una dupla de palabras, donde cada
dupla ha sido formada por la acción de 40 mil veces una
función de reducción y resumen.
[Link]
mar/rainbow-tables
112
¿Cómo funciona?
[Link]
%C3%ADris 113
OPHcrack LiveCD
[Link]
114
OPHcrack tables
[Link]
115
Pre-computed Hash Table
Lista de 600 millones de contraseñas únicas de texto plano
recolectadas de alrededor de 100 de las más grandes
filtraciones de bases de datos entre 2008-2018, con su
respectivo hash NTLM, sha1, sha256, MySQL y MD5.
[Link]
mputed-hash-table-v-1-0/ 116
ISO/IEC 10118-3:2018
Incluye las funciones hash SHA-3, STREEBOG y SM3
[Link]
117
Extremely fast Hash algorithm
Pruebas con SMHasher que evalúa las cualidades de colisión,
dispersión y aleatoriedad de las funciones hash.
[Link]
118
Fuzzy hashing
En forense digital, los hash permiten identificar un malware.
Para identificar si un binario es similar a otro, una función
hash tradicional no sirve (efecto avalancha).
Se requiere un hash que no use efecto avalancha.
SSDEEP calcula múltiples hashes para partes de tamaños
fijos del archivo, llamado rolling hash, y entrega la similitud
entre 2 archivos.
119
Child Sexual Abuse Material (CSAM) detection
[Link]
120
NeuralHash collisions
$ python [Link] [Link]
59a34eabe31910abfb06f308
$ python [Link] [Link]
59a34eabe31910abfb06f308
[Link]
a4bf3abb29856c29197c0be 121
Subresource Integrity (SRI) Hash
Permite que el browser detecte si una librería de un tercero ha
sido modificada desde que el servidor la configuró.
Para que esto funcione los sitios web deben tener habilitado
CORS.
122
CORS
123
FIN