82 lines
3.1 KiB
C#
82 lines
3.1 KiB
C#
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";
|
|
|
|
/// <summary>
|
|
/// Erzeugt das zufällige, zehnstellige, alphanumerisches Initialpasswort
|
|
/// </summary>
|
|
/// <param name="random">Random zur Erzeugung zufälliger Indizes</param>
|
|
/// <returns></returns>
|
|
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;
|
|
}
|
|
|
|
/// <summary>
|
|
/// Erzeugt das Passwort für die neuangelegte Datenbank.
|
|
/// </summary>
|
|
/// <param name="initialPassword">Das 10-stellige Initialpasswort</param>
|
|
/// <returns>Ein ApplicationUserCredentials-Objekt mit den für die Datenbank notwendigen strings.</returns>
|
|
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;
|
|
}
|
|
}
|
|
}
|