You are using PBKDF2-SHA1, which is decent but not big. Bcrypt is a little better, and scrypt is even stronger. But since .net already includes a built-in implementation of PBKDF2, this is an acceptable choice.
The biggest mistake is that you did not get the point in salt. The salt must be unique to each user. The standard practice is simply to create a random value of at least 64 bits. Store it with the hash in the database.
If you want, you can divide the salt into two parts. One is stored in the database next to the user, which is different for each, and one common part is stored in another place. This improves the benefits of both.
I also recommend using a higher workfactor than 1000 . Find out which performance is acceptable and adjust it accordingly. I would not go below 10000, and in some situations (disk encryption) a million is also acceptable.
CodesInChaos
source share