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.
HTTP-Basisauthentifizierung
Die HTTP-Authentifizierung básica es un método para que el Klient proporcione un nombre de Nutzername y una contraseña al realizar una solicitud.
Dies ist die einfachste Möglichkeit, die Zugriffskontrolle durchzusetzen, da keine Cookies, Sitzungen oder andere Elemente erforderlich sind. Um dies zu nutzen, muss der Client die senden Genehmigung zusammen mit jeder Anfrage, die Sie machen. Der Name von Nutzername und das Passwort Sie sind nicht verschlüsselt, aber sie sind wie folgt aufgebaut:
Der Benutzername und das Passwort werden zu einer einzigen Zeichenfolge verkettet: Benutzername Passwort Diese Zeichenfolge ist Base64-codiert
Das Schlüsselwort BASIC wird vor diesen fest codierten Wert gestellt
Beispiel für einen Benutzer namens juan mit einem geheimen Passwort:
curl --header "Autorisierung: Basic am9objpzZWNyZXQ =" my-website.com
Die Implementierung ist auch in Node.js ziemlich einfach - das folgende Code-Snippet zeigt, wie Sie eine erstellen können Express Middleware es zu tun.
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); };
Natürlich können Sie dies auf einer höheren Ebene tun, wie in Nginx.
Klingt einfach, oder? Was sind die Nachteile der Verwendung der HTTP-Basisauthentifizierung?
Die Nachteile:
- Der Benutzername und das Kennwort werden bei jeder Anforderung gesendet, wodurch sie möglicherweise offengelegt werden, selbst wenn sie über eine sichere Verbindung gesendet werden, mit der eine Verbindung besteht SSL / TLS, si un sitio Netz utiliza un cifrado débil o un atacante puede romperlo,
- Benutzernamen und Kennwörter werden sofort angezeigt. Es gibt keine Möglichkeit, den Benutzer mithilfe der Basisauthentifizierung abzumelden. Das Ablaufen von Anmeldeinformationen ist nicht trivial. Sie müssen den Benutzer bitten, das Kennwort zu ändern, um dies zu tun.
Kekse
Cuando un Server recibe una solicitud HTTP en la respuesta, puede enviar un encabezado Set-Cookie. Das Browser lo coloca en un contenedor de cookies, y la Plätzchen se enviará junto con cada solicitud realizada al mismo origen en el encabezado Cookie HTTP.
Um Cookies für Authentifizierungszwecke zu verwenden, müssen einige wichtige Prinzipien befolgt werden.
Verwenden Sie immer HttpOnly-Cookies
Verwenden Sie immer das Flag, um die Möglichkeit von XSS-Angriffen zu verringern HttpOnly beim Setzen von Cookies. Auf diese Weise werden sie nicht in angezeigt document.cookies.
Verwenden Sie immer signierte Cookies
Mit signierten Cookies kann ein Server feststellen, ob der Client ein Cookie geändert hat.
Más adelante, todas las solicitudes utilizan las cookies establecidas para el Domain dado:
Verwendung von Chrome-Cookies
Die Nachteile:
- Sie müssen noch einen Schritt weiter gehen, um CSRF-Angriffe abzuschwächen
- Inkompatibilität mit REST, da ein Status in ein zustandsloses Protokoll eingeführt wird
Aufzeichnungen
Heute ist JWT (JSON Web Token) überall; Die potenziellen Sicherheitsprobleme sind jedoch einen Blick wert.
JWT besteht aus drei Teilen:
- Header: que contiene el tipo de token y el Algorithmus de hash
- Nutzvolle Ladung: mit den Ansprüchen.
- Feste: que puede calcularse de la siguiente manera si elige HMAC SHA256: HMACSHA256( base64UrlEncode(Header) + «.» + base64UrlEncode(payload), secret)
Hinzufügen JWT zu Anwendungen Koa Es sind nur ein paar Codezeilen:
var koa = erfordern ('koa'); var jwt = require ('koa-jwt'); var app = koa (); app.use (jwt ({secret: 'very-secret'})); // Geschützte Middleware app.use (function * () {// Der Inhalt des Tokens ist in this.state.user verfügbar. This.body = {secret: '42'};});
Anwendungsbeispiel:
curl --header „Authorization: Inhaber eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiYWRJONY7DMXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiYWRJONW4GRG9lIiwiOWRJONW4OrZOrZB siteBuyWRJONY7MVCJM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiYWRJONY9DrG9lIiwiYWRJONW4OrZOrZBrsiteBuyWRJONW4OrZBrgsite
Wie die vorherigen können die Token auch in Chrome beobachtet werden:
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 Lokaler Speicher oder SessionStorage, Dies kann zu XSS-Angriffen führen.
Die Nachteile:
- Sie müssen die Extrameile gehen, um XSS-Angriffe abzuschwächen
Firmen
Ya Sein 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.
Eine Möglichkeit, dies zu lösen, zumindest wenn es um die API und nicht um den Browser geht, besteht darin, jede Anfrage zu signieren. Wie können wir das machen?
Wenn ein Verbraucher einer API eine Anfrage stellt, muss er diese signieren, was bedeutet, dass er eine erstellen muss Hash der gesamten Anfrage mit einem privaten Schlüssel. Für diese Hash-Berechnung können Sie Folgendes verwenden:
- HTTP-Methode
- Pfad anfordern
- Überschriften HTTP
- HTTP-Payload-Prüfsumme
- und einen privaten Schlüssel zum Erstellen des Hash
Damit dies funktioniert, müssen sowohl der API-Consumer als auch der Provider denselben privaten Schlüssel haben. Sobald Sie die Signatur haben, müssen Sie sie der Anfrage hinzufügen, entweder in Abfragezeichenfolgen oder in HTTP-Headern. Außerdem muss ein Datum hinzugefügt werden, damit Sie ein Ablaufdatum definieren können.
¿Por qué pasar por todos estos pasos? Porque incluso si la capa de transporte se ve comprometida, un atacante solo puede leer su der Verkehr, 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.
Node-http-Signatur befasst sich mit der Signatur von HTTP-Anfragen und ist einen Besuch wert.
Die Nachteile:
- Kann nicht in Browser / Client verwendet werden, nur zwischen APIs
Einmalpasswörter
Einmalkennwortalgorithmen generieren ein Einmalkennwort mit einem gemeinsamen Geheimnis und der aktuellen Zeit oder dem aktuellen Zähler:
- Einmalkennwortalgorithmus zeitbasiert, basiert auf der aktuellen Zeit.
- Einmalkennwortalgorithmus basierend auf HMACbasiert auf einem Zähler.
Diese Methoden werden in Anwendungen verwendet, die die Zwei-Faktor-Authentifizierung nutzen: Ein Benutzer gibt den Benutzernamen und das Kennwort ein, und sowohl der Server als auch der Client generieren ein Einmalkennwort.
Implementieren Sie dies in Node.js mit Nicht p es ist relativ einfach.
Nachteile:
- Mit gemeinsam genutzten geheimen Benutzertoken (falls gestohlen) können sie emuliert werden
- Da Clients gestohlen werden können, verfügen alle Echtzeitanwendungen über Methoden, um dies zu vermeiden, z. B. einen E-Mail-Reset, der der Anwendung zusätzliche Angriffsmethoden hinzufügt
Welche Webauthentifizierungsmethode soll wann gewählt werden?
Wenn Sie nur eine Webanwendung unterstützen müssen, sind Cookies oder Token in Ordnung. Denken Sie bei Cookies an XSRF, damit JWT sich um XSS kümmert.
Wenn Sie eine Web-App und einen mobilen Client unterstützen müssen, verwenden Sie eine API, die die tokenbasierte Authentifizierung unterstützt.
Wenn Sie APIs erstellen, die miteinander kommunizieren, verwenden Sie besser die Anforderungssignatur.