MD5 is fast and broken; deriving a token/password/reset value from it (e.g. token == md5(login)) enables brute force and collisions leading to account takeover.
Use a slow salted KDF (bcrypt/scrypt/argon2) for credentials and crypto.randomBytes for tokens; never MD5.