passwords.py 880 B

1234567891011121314151617181920212223242526
  1. import bcrypt
  2. BCRYPT_PASSWORD_PREFIX = "{bcrypt}"
  3. def hash_password(password: str) -> str:
  4. """Return an AUTH_ACCOUNTS-ready bcrypt password value."""
  5. salt = bcrypt.gensalt()
  6. hashed = bcrypt.hashpw(password.encode("utf-8"), salt).decode("utf-8")
  7. return f"{BCRYPT_PASSWORD_PREFIX}{hashed}"
  8. def verify_password(plain_password: str, stored_password: str) -> bool:
  9. """Verify a plaintext password against a stored password spec."""
  10. if stored_password.startswith(BCRYPT_PASSWORD_PREFIX):
  11. hashed_password = stored_password[len(BCRYPT_PASSWORD_PREFIX) :]
  12. if not hashed_password:
  13. return False
  14. try:
  15. return bcrypt.checkpw(
  16. plain_password.encode("utf-8"), hashed_password.encode("utf-8")
  17. )
  18. except ValueError:
  19. return False
  20. return stored_password == plain_password