Skip to content
Closed
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -16,13 +16,23 @@
_SECRET_LEN: Final = 20


# Application-wide pepper/salt for PBKDF2 (should ideally be kept secret and configurable)
_API_KEY_PEPPER: Final = b"models-library-api-key-pepper-CHANGE_ME"
_API_KEY_HASH_ITERATIONS: Final = 100_000

def generate_api_key_prefix(name: str) -> str:
return _PUNCTUATION_REGEX.sub("_", name[:5])


def generate_unique_api_key(name: str, length: int = _KEY_LEN) -> str:
prefix = generate_api_key_prefix(name)
hashed = hashlib.sha256(name.encode()).hexdigest()
# Use PBKDF2-HMAC-SHA256 with an application-wide pepper (salt) and high iteration count
hashed = hashlib.pbkdf2_hmac(
"sha256",
name.encode(),
_API_KEY_PEPPER,
_API_KEY_HASH_ITERATIONS,
).hex()
return f"{prefix}_{hashed[:length]}"


Expand Down
Loading