§
    t�’jv	  ã                  óX   — d dl mZ 	 d dlZd dlZd dlZd dlZdZdZdZdd	„Z	dd„Z
dd„ZdS )é    )ÚannotationsNi † é   Úsha256ÚpasswordÚstrÚreturnc                ó.  — | st          d¦  «        ‚t          j        t          ¦  «        }t	          j        t          |                      d¦  «        |t          ¦  «        }| 	                    ¦   «         }| 	                    ¦   «         }dt          › d|› d|› �S )zKHash a plaintext password with PBKDF2-HMAC-SHA256 and a secure random salt.u+   Máº­t kháº©u khÃ´ng Ä‘Æ°á»£c Ä‘á»ƒ trá»‘ng.úutf-8zpbkdf2_sha256$ú$)
Ú
ValueErrorÚsecretsÚtoken_bytesÚ
SALT_BYTESÚhashlibÚpbkdf2_hmacÚ	HASH_ALGOÚencodeÚ
ITERATIONSÚhex)r   ÚsaltÚderivedÚsalt_hexÚhash_hexs        ú7C:\Projects\DSCons\app\services\auth\password_hasher.pyÚhash_passwordr      sŽ   € àð HÝÐFÑGÔGÐGåÔ�zÑ*Ô*€DÝÔ!ÝØ�Š˜Ñ Ô ØÝñ	ô €Gð �xŠx‰zŒz€HØ�{Š{‰}Œ}€HØ>�JÐ>Ð>¨Ð>Ð>°HÐ>Ð>Ð>ó    Úhashed_passwordú
str | NoneÚboolc                ó²  — | r|sdS 	 |                      d¦  «        }t          |¦  «        dk    rdS |\  }}}}|dk    rdS t          |¦  «        }t                               |¦  «        }t                               |¦  «        }	t          j        t          |                      d¦  «        ||¦  «        }
t          j
        |
|	¦  «        S # t          $ r Y dS w xY w)zXVerify a plaintext password against a stored PBKDF2 hash using constant-time comparison.Fr   é   Úpbkdf2_sha256r
   )ÚsplitÚlenÚintÚbytesÚfromhexr   r   r   r   ÚhmacÚcompare_digestÚ	Exception)r   r   ÚpartsÚalgoÚiter_strr   Úexpected_hash_hexÚ
iterationsr   Úexpected_hashÚcandidate_hashs              r   Úverify_passwordr2       sð   € àð ˜?ð ØˆuðØ×%Ò% cÑ*Ô*ˆÝˆu‰:Œ:˜Š?ˆ?Ø�5à6;Ñ3ˆˆh˜Ð"3Ø�?Ò"Ð"Ø�5å˜‘]”]ˆ
Ý�}Š}˜XÑ&Ô&ˆÝŸšÐ&7Ñ8Ô8ˆå Ô,ÝØ�OŠO˜GÑ$Ô$ØØñ	
ô 
ˆõ Ô" >°=ÑAÔAÐAøÝð ð ð Øˆuˆuðøøøs   ˆ(C ²C ÁBC Ã
CÃCútuple[bool, str | None]c                óÈ   — | rt          | ¦  «        dk     rdS t          t          j        d| ¦  «        ¦  «        }t          t          j        d| ¦  «        ¦  «        }|r|sdS dS )z¨Validate enterprise password complexity requirements:
    - Minimum 8 characters
    - Must contain at least one letter and at least one digit or special character
    é   )Fu<   Máº­t kháº©u pháº£i cÃ³ Ä‘á»™ dÃ i tá»‘i thiá»ƒu 8 kÃ½ tá»±.z[a-zA-Z]z[\d\W_])Fu\   Máº­t kháº©u pháº£i chá»©a Ã­t nháº¥t 1 chá»¯ cÃ¡i vÃ  1 sá»‘ hoáº·c kÃ½ tá»± Ä‘áº·c biá»‡t.)TN)r$   r   ÚreÚsearch)r   Ú
has_letterÚhas_digit_or_specials      r   Úvalidate_password_strengthr:   =   sw   € ð
 ð U•s˜8‘}”} qÒ(Ð(ØTÐTå•b”i ¨XÑ6Ô6Ñ7Ô7€JÝ¥¤	¨*°hÑ ?Ô ?Ñ@Ô@Ðàð 
Ð/ð 
ð
ð 
ð
 ˆ:r   )r   r   r   r   )r   r   r   r   r   r   )r   r   r   r3   )Ú
__future__r   r   r(   r6   r   r   r   r   r   r2   r:   © r   r   ú<module>r=      s“   ðØ "Ð "Ð "Ð "Ð "Ð "à Sà €€€Ø €€€Ø 	€	€	€	Ø €€€à€
Ø€
Ø€	ð?ð ?ð ?ð ?ð"ð ð ð ð:ð ð ð ð ð r   