/// <summary> /// /// </summary> /// <param name="password"></param> /// <param name="algorithm"></param> /// <param name="salt">De te gebruiken salt, welke minimaal uit 16 karakters dient te bestaan</param> /// <param name="key">De primaire (master) sleutel waarmee de hash gegenereerd dient te worden</param> /// <returns></returns> public static PasswordResult HashPassword(string password, EnmSecureHashingAlgorithm algorithm, string salt, string key) { // Controleer parameters if (String.IsNullOrEmpty(password)) throw new ArgumentNullException("password"); if (salt == null || salt.Length < SALT_LENGTH) throw new ArgumentException("Must be atleast " + SALT_LENGTH.ToString() + " characters in length", "salt"); if (key == null || key.Length < MIN_SECRETKEY_LENGTH) throw new ArgumentException("Must be atleast " + MIN_SECRETKEY_LENGTH.ToString() + " characters in length", "masterKey"); // Genereer een salt en converteer het wachtwoord naar bytes var factory = HMACFactories.HMACSHA512; var saltBytes = Encoding.ASCII.GetBytes(salt); var passwordBytes = Encoding.ASCII.GetBytes(password); var generatedHash = new PBKDF2(factory, passwordBytes, saltBytes, HASH_ITERATIONS).GetBytes(64); return new PasswordResult(algorithm.ToString(), HASH_ITERATIONS, Convert.ToBase64String(saltBytes), Convert.ToBase64String(generatedHash)); }
/// <summary> /// Valideer of een wachtwoord geldig is door deze met de ingevoerde parameters te vergelijken. /// </summary> /// <param name="password">Het plain text wachtwoodr dat vergeleken moet worden met de secure hash</param> /// <param name="method">Het te gebruiken hashing algorithme</param> /// <param name="salt">Base-64 Encoded salt (gegenereerd met de methode HashPassword)</param> /// <param name="iteraties">Het aantal hashing iteraties</param> /// <param name="passwordHash">Base-64 Encoded password hash(Zoals gegenereerd uit de methode HashPassword)</param> /// <returns>True indien het wachtwoord overeen komt met de secure hash</returns> public static bool ValidatePasswordHash(string password, EnmSecureHashingAlgorithm method, string salt, int iteraties, string passwordHash) { // Valideer input if (String.IsNullOrEmpty(password)) throw new ArgumentNullException("password"); if (iteraties < 1) throw new ArgumentNullException("Value must be greater then 0", "iteraties"); if (String.IsNullOrEmpty(salt)) throw new ArgumentNullException("salt"); if (String.IsNullOrEmpty(passwordHash)) throw new ArgumentNullException("passwordHash"); // Bereid de parameters voor op gebruik var factory = method.Factory(); // De te gebruiken HMACSHA algoritme var passwordBytes = Convert.FromBase64String(password); // Het te valideren wachtwoor als bytes var saltBytes = Convert.FromBase64String(salt); // Het te valideren wachtwoor als bytes var generatedHash = new PBKDF2(factory, passwordBytes, saltBytes, iteraties).GetBytes(64); // Slow compare return SlowEquals(generatedHash, Convert.FromBase64String(passwordHash)); }