using System; using System.Security.Cryptography; using System.Text; namespace BeWoDatabaseTerminator.Security { public static class PasswordHelper { private const string _LowerCaseLetters = "abcdefghijklmnopqrstuvwxyz"; private const string _UpperCaseLetters = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"; private const string _Numbers = "0123456789"; /// /// Erzeugt das zufällige, zehnstellige, alphanumerisches Initialpasswort /// /// Random zur Erzeugung zufälliger Indizes /// public static string GenerateInitialPassword(Random random) { var password = ""; for(var i = 0; i < 10; i++) { var r1 = random.Next(0, 3); switch(r1) { case 0: password += _LowerCaseLetters[random.Next(0, 26)]; break; case 1: password += _UpperCaseLetters[random.Next(0, 26)]; break; case 2: password += _Numbers[random.Next(0, 10)]; break; default: password += _LowerCaseLetters[i]; break; } } return password; } /// /// Erzeugt das Passwort für die neuangelegte Datenbank. /// /// Das 10-stellige Initialpasswort /// Ein ApplicationUserCredentials-Objekt mit den für die Datenbank notwendigen strings. public static ApplicationUserCredentials GenerateUserCredentials(string initialPassword) { if(string.IsNullOrWhiteSpace(initialPassword) || initialPassword.Length < 10) { throw new ArgumentException("Das Initialpasswort ist ungültig!", nameof(initialPassword)); } var salt = BitConverter.ToString(new MD5CryptoServiceProvider().ComputeHash(Encoding.UTF8.GetBytes(Guid.NewGuid().ToString()))); var md5 = new MD5CryptoServiceProvider(); var hashedPassword = BitConverter.ToString(md5.ComputeHash(Encoding.UTF8.GetBytes($"{salt}_{initialPassword}_o238rRndguK4Fh8dsfkhwon54H8n3qo4itv8nz3o4LvnzQs0npmwEp"))); var bCryptSalt = BCrypt.GenerateSalt(); var bCryptPassword = BCrypt.HashPassword(initialPassword, bCryptSalt); return new ApplicationUserCredentials(salt, hashedPassword, bCryptPassword); } } public class ApplicationUserCredentials { public string Salt { get; } public string HashedPassword { get; } public string BCryptPassword { get; } public ApplicationUserCredentials(string salt, string hashedPassword, string bCryptPassword) { Salt = salt; HashedPassword = hashedPassword; BCryptPassword = bCryptPassword; } } }