From b88cb388b7427923a8be93eb3129713179fb4480 Mon Sep 17 00:00:00 2001 From: pablonyx Date: Wed, 11 Dec 2024 11:30:05 -0800 Subject: [PATCH] Faster api hashing (#3423) * migrate hashing to run faster v1 * k --- backend/danswer/auth/api_key.py | 19 ++++++++++++++++--- 1 file changed, 16 insertions(+), 3 deletions(-) diff --git a/backend/danswer/auth/api_key.py b/backend/danswer/auth/api_key.py index aef557960f6b..4931a9037ca1 100644 --- a/backend/danswer/auth/api_key.py +++ b/backend/danswer/auth/api_key.py @@ -1,3 +1,4 @@ +import hashlib import secrets import uuid from urllib.parse import quote @@ -18,7 +19,8 @@ _API_KEY_HEADER_NAME = "Authorization" # organizations like the Internet Engineering Task Force (IETF). _API_KEY_HEADER_ALTERNATIVE_NAME = "X-Danswer-Authorization" _BEARER_PREFIX = "Bearer " -_API_KEY_PREFIX = "dn_" +_API_KEY_PREFIX = "on_" +_DEPRECATED_API_KEY_PREFIX = "dn_" _API_KEY_LEN = 192 @@ -52,7 +54,9 @@ def extract_tenant_from_api_key_header(request: Request) -> str | None: api_key = raw_api_key_header[len(_BEARER_PREFIX) :].strip() - if not api_key.startswith(_API_KEY_PREFIX): + if not api_key.startswith(_API_KEY_PREFIX) and not api_key.startswith( + _DEPRECATED_API_KEY_PREFIX + ): return None parts = api_key[len(_API_KEY_PREFIX) :].split(".", 1) @@ -63,10 +67,19 @@ def extract_tenant_from_api_key_header(request: Request) -> str | None: return unquote(tenant_id) if tenant_id else None +def _deprecated_hash_api_key(api_key: str) -> str: + return sha256_crypt.hash(api_key, salt="", rounds=API_KEY_HASH_ROUNDS) + + def hash_api_key(api_key: str) -> str: # NOTE: no salt is needed, as the API key is randomly generated # and overlaps are impossible - return sha256_crypt.hash(api_key, salt="", rounds=API_KEY_HASH_ROUNDS) + if api_key.startswith(_API_KEY_PREFIX): + return hashlib.sha256(api_key.encode("utf-8")).hexdigest() + elif api_key.startswith(_DEPRECATED_API_KEY_PREFIX): + return _deprecated_hash_api_key(api_key) + else: + raise ValueError(f"Invalid API key prefix: {api_key[:3]}") def build_displayable_api_key(api_key: str) -> str: