Nelle ultime 2 settimane ho letto molti blog sulla sicurezza dei siti Web e sulle password di hashing.
Molti siti hanno menzionato i pro ei contro su diversi modi per farlo, il che mi ha lasciato un po 'confuso su quanto sia sicuro il mio codice.
Se possibile, qualcuno può dare un'occhiata al codice qui sotto e fammi sapere cosa ne pensano. Ho postato questa domanda su link ma ancora spento, nessuno ha risposto.
I passaggi che ho seguito sono i seguenti:
- Crea salt random
- Aggiungi salt salt e email casuali per creare sale per la password (l'email verrà crittografata nel database)
-
Inserisci la password e sali e archivia nel database
public const int HashBytes = 128; public const int DefaultIterations = 10000; //Create random bytes for salt public static string SaltSHA256() { const int minSaltSize = 8; const int maxSaltSize = 16; var random = new Random(); int saltSize = random.Next(minSaltSize, maxSaltSize); byte[] saltBytes = new byte[saltSize]; var rng = new RNGCryptoServiceProvider(); rng.GetNonZeroBytes(saltBytes); HashAlgorithm hash = new SHA256Managed(); byte[] bytes = hash.ComputeHash(saltBytes); return Convert.ToBase64String(bytes); } //Create salt using email and public static string SaltSHA256() //Store email and public static string SaltSHA256() in database public static string SaltRfc2898(string email,string hashedSalt) { var salt = new Rfc2898DeriveBytes(email, Encoding.UTF8.GetBytes(hashedSalt), DefaultIterations); return Convert.ToBase64String(salt.GetBytes(HashBytes)); } //Hash password and salt public static string PasswordHashRfc2898(string password,string salt) { var hashedPassword = new Rfc2898DeriveBytes(password, Encoding.UTF8.GetBytes(salt), DefaultIterations); return Convert.ToBase64String(hashedPassword.GetBytes(HashBytes)); } //Get salt and password from database based on username //Salt in from data created by public static string SaltSHA256() public static bool DoPasswordsMatch(string password,string salt) { //Password would be pulled from db based on username byte[] testPassword = Convert.FromBase64String("basestring"); //Salt would be pulled from database based on username var saltFromDatabase = salt; //Hash password and salt var hashUserInputAndSalt = PasswordHashRfc2898(password, saltFromDatabase); //Convert to byte[] ready for comparison byte[] convertUserInputFromBase64 = Convert.FromBase64String(hashUserInputAndSalt); //Compare and return true or false return convertUserInputFromBase64.SequenceEqual(testPassword); }