Passer au contenu principal




En la lección de hoy vamos a comenzar con la más básica, la autenticación HTTP básica, continuaremos con las cookies y los tokens , y terminaremos con firmas y contraseñas de un solo uso. Sigue leyendo para que aprendas todo acerca de esto.

Authentification de base HTTP

La Authentification HTTP básica es un método para que el client proporcione un nombre de Nom d'utilisateur y una contraseña al realizar una solicitud.

C'est le moyen le plus simple possible d'appliquer le contrôle d'accès, car il ne nécessite pas de cookies, de sessions ou quoi que ce soit d'autre. Pour l'utiliser, le client doit envoyer le Autorisation avec chaque demande que vous faites. Le nom de Nom d'utilisateur et la le mot de passe ils ne sont pas chiffrés, mais ils sont construits comme ceci:

Le nom d'utilisateur et le mot de passe sont concaténés en une seule chaîne: Identifiant Mot de passe cette chaîne est encodée en Base64

Le mot clé DE BASE est placé avant cette valeur codée en dur

Exemple pour un utilisateur nommé juan avec un mot de passe secret:

curl --header "Autorisation: Basic am9objpzZWNyZXQ =" mon-siteweb.com

L'implémenter est également assez facile dans Node.js - l'extrait de code suivant montre comment vous pouvez créer un Intergiciel express pour le faire.


import basicAuth from 'basic-auth';

function unauthorized(res) {
res.set('WWW-Authenticate', 'Basic realm=Authorization Required');
return res.send(401);
};

export default function auth(req, res, next) {
const {name, pass} = basicAuth(req) || {};

if (!name || !pass) {
return unauthorized(res);
};

if (name === 'juan' && pass === 'secreta') {
return next();
}
return unauthorized(res);
};

Bien sûr, vous pouvez le faire à un niveau supérieur, comme dans nginx.

Cela semble simple, non? Alors, quels sont les inconvénients de l'utilisation de l'authentification de base HTTP?

Les inconvénients:

  • Le nom d'utilisateur et le mot de passe sont envoyés avec chaque demande, les exposant potentiellement, même s'ils sont envoyés via une connexion sécurisée connectée à SSL / TLS, si un sitio la toile utiliza un cifrado débil o un atacante puede romperlo,
  • Les noms d'utilisateur et les mots de passe seront immédiatement exposés, il n'y a aucun moyen de déconnecter l'utilisateur en utilisant l'authentification de base, l'expiration des informations d'identification n'est pas anodine - vous devez demander à l'utilisateur de changer le mot de passe pour le faire.

biscuits

Cuando un serveur recibe una solicitud HTTP en la respuesta, puede enviar un encabezado Set-Cookie. le le navigateur lo coloca en un contenedor de cookies, y la cookie se enviará junto con cada solicitud realizada al mismo origen en el encabezado Cookie HTTP.

Pour utiliser des cookies à des fins d'authentification, il y a quelques principes clés qui doivent être suivis.

Utilisez toujours les cookies HttpOnly

Pour atténuer la possibilité d'attaques XSS, utilisez toujours l'indicateur HttpOnly lors de la configuration des cookies. De cette façon, ils n'apparaîtront pas dans document.cookies.

Utilisez toujours des cookies signés

Avec les cookies signés, un serveur peut dire si le client a modifié un cookie.

Más adelante, todas las solicitudes utilizan las cookies establecidas para el domaine dado:

Utilisation des cookies Chrome

Les inconvénients:

  • Besoin de faire un effort supplémentaire pour atténuer les attaques CSRF
  • Incompatibilité avec REST car il introduit un état dans un protocole sans état

Registres

Aujourd'hui, JWT (JSON Web Token) est partout; les problèmes de sécurité potentiels valent cependant le coup d'œil.

JWT se compose de trois parties:

  • Entête: que contiene el tipo de token y el algoritmo de hash
  • Charge utile: contenant les revendications.
  • Solidifier: que puede calcularse de la siguiente manera si elige HMAC SHA256: HMACSHA256( base64UrlEncode(entête) + «.» + base64UrlEncode(payload), secret)

Ajouter JWT aux applications Koa ce n'est que quelques lignes de code:

var koa = require ('koa'); var jwt = require ('koa-jwt'); var app = koa (); app.use (jwt ({secret: 'très-secret'})); // Middleware protégé app.use (function * () {// le contenu du token sera disponible dans this.state.user this.body = {secret: '42'};});

Exemple d'utilisation:

boucle --header « Autorisation: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiYWRJONYQDXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiOWRJONYQRG9lIiwiYWRJONW4OrZOrZBrsiteBuyWRJONW4GRG9lIiwiYWRJONY7MyGsiteBuyByWRtaW4GRG9lIiwiYWRJONW4OrZOrZSiteBuyWRTaW4gRG9lIiwiYWRJONW4OrZOrZSiWo9WRTaW4Gsite

Comme les précédents, les jetons peuvent également être observés dans Chrome:

Si está escribiendo API para aplicaciones móviles nativas o SPA, JWT puede ser una buena opción para ti. Una cosa a tener en cuenta: para usar JWT en el navegador, debe almacenarlo en Stockage local ou Stockage de session, ce qui peut conduire à des attaques XSS.

Les inconvénients:

  • Besoin de faire un effort supplémentaire pour atténuer les attaques XSS

Entreprises

Ya être utilizando cookies o tokens, si la capa de transporte por cualquier motivo queda expuesta, sus credenciales son fáciles de acceder, y con un token o cookie el atacante puede actuar como el usuario real.

Une façon possible de résoudre ce problème, du moins en ce qui concerne l'API et non le navigateur, consiste à signer chaque demande. Comment pouvons-nous le faire?

Lorsqu'un consommateur d'une API fait une demande, il doit la signer, ce qui signifie qu'il doit créer un hacher de l'ensemble de la demande à l'aide d'une clé privée. Pour ce calcul de hachage, vous pouvez utiliser:

  • Méthode HTTP
  • Chemin de la demande
  • En-têtes HTTP
  • Somme de contrôle de la charge utile HTTP
  • et une clé privée pour créer le hachage

Pour que cela fonctionne, le consommateur d'API et le fournisseur doivent avoir la même clé privée. Une fois que vous avez la signature, vous devez l'ajouter à la requête, soit dans les chaînes de requête, soit dans les en-têtes HTTP. De plus, une date doit également être ajoutée afin que vous puissiez définir une date d'expiration.

¿Por qué pasar por todos estos pasos? Porque incluso si la capa de transporte se ve comprometida, un atacante solo puede leer su circulation, no podrá actuar como usuario, ya que el atacante no podrá firmar solicitudes, ya que la clave privada no está en su poder. La mayoría de los servicios de AWS están utilizando este tipo de autenticación.

noeud-http-signature traite de la signature des requêtes HTTP et vaut le détour.

Les inconvénients:

  • Ne peut pas être utilisé dans le navigateur / client, uniquement entre les API

Mots de passe à usage unique

Les algorithmes de mot de passe à usage unique génèrent un mot de passe à usage unique avec un secret partagé et l'heure ou le compteur actuel:

  • Algorithme de mot de passe à usage unique basé sur le temps, est basé sur l'heure actuelle.
  • Algorithme de mot de passe à usage unique basé sur HMAC, est basé sur un compteur.

Ces méthodes sont utilisées dans les applications qui tirent parti de l'authentification à deux facteurs: un utilisateur entre le nom d'utilisateur et le mot de passe, et le serveur et le client génèrent un mot de passe à usage unique.

Dans Node.js, implémentez ceci en utilisant pas p c'est relativement facile.

Les inconvénients:

  • Avec les jetons d'utilisateurs secrets partagés (en cas de vol), ils peuvent être émulés
  • parce que les clients peuvent être volés, toutes les applications en temps réel ont des méthodes pour éviter cela, comme une réinitialisation des e-mails qui ajoute des vecteurs d'attaque supplémentaires à l'application
Quelle méthode d'authentification Web choisir quand?

Si vous ne devez prendre en charge qu'une seule application Web, les cookies ou les jetons conviennent. Pour les cookies, pensez à XSRF, donc JWT s'occupe de XSS.

Si vous devez prendre en charge une application Web et un client mobile, utilisez une API qui prend en charge l'authentification basée sur les jetons.

Si vous créez des API qui communiquent entre elles, mieux vaut utiliser la signature des demandes.