| import bcrypt | |
| BCRYPT_PASSWORD_PREFIX = "{bcrypt}" | |
| def hash_password(password: str) -> str: | |
| """Return an AUTH_ACCOUNTS-ready bcrypt password value.""" | |
| salt = bcrypt.gensalt() | |
| hashed = bcrypt.hashpw(password.encode("utf-8"), salt).decode("utf-8") | |
| return f"{BCRYPT_PASSWORD_PREFIX}{hashed}" | |
| def verify_password(plain_password: str, stored_password: str) -> bool: | |
| """Verify a plaintext password against a stored password spec.""" | |
| if stored_password.startswith(BCRYPT_PASSWORD_PREFIX): | |
| hashed_password = stored_password[len(BCRYPT_PASSWORD_PREFIX) :] | |
| if not hashed_password: | |
| return False | |
| try: | |
| return bcrypt.checkpw( | |
| plain_password.encode("utf-8"), hashed_password.encode("utf-8") | |
| ) | |
| except ValueError: | |
| return False | |
| return stored_password == plain_password | |