Passwords stored salt and some change is password logic
This commit is contained in:
+24
-2
@@ -3,7 +3,8 @@
|
||||
|
||||
import sqlite3
|
||||
import os
|
||||
from hashlib import sha256
|
||||
from hashlib import scrypt, sha256
|
||||
import hmac
|
||||
from pathlib import Path
|
||||
from uuid import uuid4
|
||||
|
||||
@@ -15,7 +16,28 @@ AVATARS_DIR.mkdir(parents=True, exist_ok=True)
|
||||
|
||||
|
||||
def hash_password(password: str) -> str:
|
||||
return sha256(password.encode('utf-8')).hexdigest()
|
||||
salt = os.urandom(16)
|
||||
digest = scrypt(password.encode('utf-8'), salt=salt, n=16_384, r=8, p=1, dklen=32)
|
||||
return f'scrypt$16384$8$1${salt.hex()}${digest.hex()}'
|
||||
|
||||
|
||||
def verify_password(password: str, stored_hash: str) -> bool:
|
||||
if stored_hash.startswith('scrypt$'):
|
||||
try:
|
||||
algorithm, cost, block_size, parallelism, salt_hex, digest_hex = stored_hash.split('$')
|
||||
if algorithm != 'scrypt':
|
||||
return False
|
||||
digest = scrypt(
|
||||
password.encode('utf-8'), salt=bytes.fromhex(salt_hex),
|
||||
n=int(cost), r=int(block_size), p=int(parallelism), dklen=32,
|
||||
)
|
||||
return hmac.compare_digest(digest.hex(), digest_hex)
|
||||
except (ValueError, TypeError):
|
||||
return False
|
||||
if len(stored_hash) == 64:
|
||||
legacy_digest = sha256(password.encode('utf-8')).hexdigest()
|
||||
return hmac.compare_digest(legacy_digest, stored_hash)
|
||||
return False
|
||||
|
||||
DEFAULT_TAGS = ('#Internet', '#Cybersecurity', '#Fediverse', '#Food', '#Photography', '#Music', '#AI')
|
||||
|
||||
|
||||
Reference in New Issue
Block a user