using the Stanford version of PBKDF2 because it's faster