Secure code review of a login functionality written in Python: find vulnerabilities, mitigations, and how to implement them.
Identify weaknesses such as plaintext password handling, user enumeration, timing leaks, unlimited retries, and unsafe state updates. Implement a secure replacement.
Use def secure_login(username, password, users, attempts):. users maps usernames to records containing a PBKDF2 salt and password hash. Return a boolean and update attempts for failed or successful logins.
def secure_login(username, password, users, attempts):