I guess username and password is doable with the nip-49.
Signup: generate a private key, encrypt it with nip-49 and send it in an event with a d tag as your username.
Signin: query event with d tag as your username and decrypt the ncryptsec with your password.
This is how I would implement username + password login.