@@ -16,6 +16,7 @@ async def generateApiKey(
1616 seed : str ,
1717 include : str = None ,
1818 add_dashes : bool = False ,
19+ prefix : str = None
1920) -> str :
2021 """
2122 Generate a secure API key based on a secret, seed, and optional parameters.
@@ -24,7 +25,8 @@ async def generateApiKey(
2425 secret: The secret key used for hashing.
2526 seed: A unique identifier used to personalize the key.
2627 include: An optional string to be included in the key generation process.
27- add_dashes: Whether to add dashes to the generated key for improved readability.
28+ add_dashes: Whether to add dashes to the generated key for improved readability. Default False
29+ prefix: A string prefix for the API key. Followed by a '-'. Default None
2830
2931 Returns:
3032 A unique and secure API key.
@@ -57,22 +59,25 @@ async def generateApiKey(
5759 api_key = hmac .new (
5860 secret .encode (), combined_hash .encode (), hashlib .sha256
5961 ).hexdigest ()
60- return str (uuid .uuid5 (uuid .NAMESPACE_DNS , api_key ))
62+ api_key = str (uuid .uuid5 (uuid .NAMESPACE_DNS , api_key ))
63+ else :
64+ salt = token_bytes (16 )
65+ kdf = PBKDF2HMAC (
66+ algorithm = hashes .SHA256 (),
67+ salt = salt ,
68+ iterations = pbkdf2_iterations ,
69+ length = 32 ,
70+ )
71+ seed = f"{ seed } { current_timestamp } { numeric_hash } " .encode ()
72+ if include :
73+ pos = random .randint (0 , len (seed ))
74+ seed = seed [:pos ] + include .encode () + seed [pos :]
6175
62- salt = token_bytes (16 )
63- kdf = PBKDF2HMAC (
64- algorithm = hashes .SHA256 (),
65- salt = salt ,
66- iterations = pbkdf2_iterations ,
67- length = 32 ,
68- )
69- seed = f"{ seed } { current_timestamp } { numeric_hash } " .encode ()
70- if include :
71- pos = random .randint (0 , len (seed ))
72- seed = seed [:pos ] + include .encode () + seed [pos :]
76+ key_bytes = kdf .derive (seed )
77+ key_base64 = base64 .urlsafe_b64encode (key_bytes ).decode ()
78+ api_key = re .sub (r"[^a-zA-Z0-9]" , "" , key_base64 )
7379
74- key_bytes = kdf .derive (seed )
75- key_base64 = base64 .urlsafe_b64encode (key_bytes ).decode ()
76- api_key = re .sub (r"[^a-zA-Z0-9]" , "" , key_base64 )
80+ if prefix :
81+ api_key = f"{ prefix } -{ api_key } "
7782
7883 return api_key
0 commit comments