Esta página se tradujo automáticamente con la API de traducción de Google Cloud.
Algunas páginas se pueden leer mejor en su totalidad.
La importancia de la seguridad en las aplicaciones web no puede subestimarse. En este artículo, exploraremos dos métodos populares para proteger las aplicaciones TypeScript: JSON Web Tokens (JWT) y bcrypt. Veremos cómo usar cada una de estas tecnologías para asegurar una aplicación de TypeScript y también aprenderemos acerca de algunos de los peligros potenciales asociados con cada enfoque.
JSON Web Token (JWT) es una forma popular de transmitir datos de forma segura entre dos partes. JWT se compone de tres partes:
Un caso de uso común para JWT es transmitir información sobre un usuario autenticado entre una aplicación web y un servidor back-end. Por ejemplo, cuando un usuario inicia sesión en una aplicación web, se puede usar un JWT para transmitir información sobre el usuario (como el nombre del usuario y la dirección de correo electrónico) al servidor back-end. El servidor back-end puede usar esta información para generar una respuesta que se adapte al usuario.
Otro caso de uso común para JWT es transmitir información sobre la sesión de un usuario desde una aplicación web a un servidor back-end. Esto se hace a menudo para evitar tener que almacenar información confidencial (como el ID de sesión de un usuario) en una cookie. Cuando caduca la sesión de un usuario, el JWT se puede utilizar para invalidar la sesión del usuario en el servidor backend.
Bcrypt es una función de hashing de contraseñas que está diseñada para ser costosa desde el punto de vista computacional. Esto es importante porque dificulta que un atacante extraiga una contraseña por fuerza bruta.
Bcrypt se usa típicamente junto con una sal. Un salt es una cadena generada aleatoriamente que se usa para hacer que la función de hash de contraseña sea más difícil de calcular. La sal generalmente se almacena junto con la contraseña codificada.
La forma más común de usar JWT en una aplicación TypeScript es usar el paquete jsonwebtoken. Este paquete proporciona un conjunto de funciones auxiliares que facilitan la generación y verificación de JWT.
Para usar jsonwebtoken, primero debemos instalarlo:
npm install jsonwebtoken
Una vez que jsonwebtoken está instalado, podemos usarlo para generar un JWT:
const jwt = require('jsonwebtoken');
const payload = {
userId: 123,
email: 'user@example.com',
name: 'John Doe',
};
const secret = 'secret';
const token = jwt.sign(payload, secret);
La función jwt.sign()
toma dos argumentos: la carga útil y el secreto. La carga útil son los datos que queremos codificar en el JWT, y el secreto se usa para generar la firma JWT.
Una vez que hayamos generado el JWT, podemos transmitirlo al servidor backend. El servidor backend puede usar la función jwt.verify()
para verificar el JWT:
const jwt = require('jsonwebtoken');
const token = 'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VySWQiOjEyMywiZW1haWwiOiJ1c2VyQGV4YW1wbGUuY29tIiwibmFtZSI6IkpvaG4gRG9lIn0.S30gaSmqhzPZU6mxPiwm53cH-j2dhYfBYuYTR3LsyiE';
const secret = 'secret';
const payload = jwt.verify(token, secret);
La función jwt.verify()
toma dos argumentos: el token y el secreto. El token es el JWT que queremos verificar y el secreto se usa para verificar la firma JWT.
Si el JWT es válido, la función jwt.verify()
devolverá la carga útil decodificada. Si el JWT no es válido, la función jwt.verify()
generará un error.
La forma más común de usar bcrypt en una aplicación TypeScript es usar el paquete bcryptjs. Este paquete proporciona un conjunto de funciones auxiliares que facilitan la generación y verificación de hashes de bcrypt.
Para usar bcryptjs, primero debemos instalarlo:
npm install bcryptjs
Una vez que bcryptjs está instalado, podemos usarlo para codificar una contraseña:
const bcrypt = require('bcryptjs');
const password = 'secret';
const salt = bcrypt.genSaltSync(10);
const hash = bcrypt.hashSync(password, salt);
La función bcrypt.hashSync()
toma dos argumentos: la contraseña y la sal. La contraseña es la contraseña que queremos codificar, y la sal se usa para hacer que la función de cifrado de contraseña sea más difícil de calcular.
Una vez que hemos generado el hash, podemos transmitirlo al servidor backend. El servidor backend puede usar la función bcrypt.compareSync()
para comparar el hash con la contraseña:
const bcrypt = require('bcryptjs');
const password = 'secret';
const hash = '$2a$10$2znyB6.qE1T.1S7X3C5NU.7bHJNz5KUzHJZzM6DQLN8tm4Gxe6Ay';
bcrypt.compareSync(password, hash); // true
La función bcrypt.compareSync()
toma dos argumentos: la contraseña y el hash. La contraseña es la contraseña que queremos comparar y el hash es el hash bcrypt con el que queremos compararlo.
Si la contraseña es válida, la función bcrypt.compareSync()
devolverá verdadero
. Si la contraseña no es válida, la función bcrypt.compareSync()
devolverá falso
.
Un peligro potencial asociado con JWT es que los datos en la carga útil no están encriptados. Esto significa que si un atacante logra obtener el JWT, podrá ver los datos en la carga útil.
Otro peligro potencial asociado con JWT es que el secreto utilizado para generar la firma JWT debe mantenerse en secreto. Si el secreto se ve comprometido, un atacante podrá generar su propio JWT con los datos que elija.
Un peligro potencial asociado con bcrypt es que es una función hash unidireccional. Esto significa que una vez que se ha cifrado una contraseña, no se puede revertir. Esto puede dificultar la recuperación de una contraseña si se olvida.
Otro peligro potencial asociado con bcrypt es que computacionalmente es costoso. Esto puede dificultar el uso de bcrypt en grandes conjuntos de datos.