AJ
Really good catch, thanks for this. You're right, matching the error string handles the content but not the timing. Since bcrypt is slow on purpose, the "email exists" path takes longer, and that gap alone is enough to enumerate valid emails even with identical error text. Fix is exactly what you said, always run a bcrypt compare, even when the email isn't found, against a fixed dummy hash, so both paths cost about the same. Folding this into the post with a note, appreciate it.
