python / expert
Snippet
Zeitkonstante HMAC-Token-Verifizierung in benutzerdefinierten Auth-Backends
Benutzerdefinierte Django-Authentifizierungs-Backends sollten hmac.compare_digest verwenden, um Timing-Angriffe über Seitenkanäle bei der kryptografischen Signaturvalidierung zu verhindern.
snippet.py
python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
import hmacimport hashlibfrom django.contrib.auth.backends import BaseBackendfrom django.contrib.auth.models import Userclass ConstantTimeHMACBackend(BaseBackend):def authenticate(self, request, token=None, signature=None, secret_key=None):if not (token and signature and secret_key):return Noneexpected_sig = hmac.new(secret_key.encode(), token.encode(), hashlib.sha256).hexdigest()if hmac.compare_digest(expected_sig, signature):return User.objects.filter(username=token).first()return None
django
Erklärung
1
class ConstantTimeHMACBackend(BaseBackend):
Erstellt eine Unterklasse von Djangos BaseBackend zur Erstellung benutzerdefinierter Authentifizierungspipelines.
2
expected_sig = hmac.new(secret_key.encode(), token.encode(), hashlib.sha256).hexdigest()
Berechnet die SHA-256 HMAC-Signatur unter Verwendung des geheimen Schlüssels und des Token-Nutzdatensatzes.
3
if hmac.compare_digest(expected_sig, signature):
Führt einen zeitkonstanten Zeichenfolgenvergleich durch, um Timing-Seitenkanalangriffe zu neutralisieren.