M8: add operational authentication mode
This commit is contained in:
@@ -4,6 +4,7 @@ import base64
|
||||
import hashlib
|
||||
import hmac
|
||||
import json
|
||||
import os
|
||||
import time
|
||||
from dataclasses import dataclass
|
||||
|
||||
@@ -50,3 +51,31 @@ def read_session_token(token: str) -> SessionPayload | None:
|
||||
if time.time() - payload.issued_at > settings.session_ttl_seconds:
|
||||
return None
|
||||
return payload
|
||||
|
||||
|
||||
def hash_password(password: str) -> str:
|
||||
salt = os.urandom(16)
|
||||
derived = hashlib.scrypt(password.encode(), salt=salt, n=2**14, r=8, p=1, dklen=32)
|
||||
encoded_salt = base64.urlsafe_b64encode(salt).decode()
|
||||
encoded_hash = base64.urlsafe_b64encode(derived).decode()
|
||||
return f"scrypt$16384$8$1${encoded_salt}${encoded_hash}"
|
||||
|
||||
|
||||
def verify_password(password: str, encoded: str | None) -> bool:
|
||||
if not encoded:
|
||||
return False
|
||||
try:
|
||||
algorithm, n, r, p, salt, expected = encoded.split("$")
|
||||
if algorithm != "scrypt":
|
||||
return False
|
||||
derived = hashlib.scrypt(
|
||||
password.encode(),
|
||||
salt=base64.urlsafe_b64decode(salt.encode()),
|
||||
n=int(n),
|
||||
r=int(r),
|
||||
p=int(p),
|
||||
dklen=32,
|
||||
)
|
||||
return hmac.compare_digest(derived, base64.urlsafe_b64decode(expected.encode()))
|
||||
except (ValueError, TypeError):
|
||||
return False
|
||||
|
||||
Reference in New Issue
Block a user