Код IT
← Каталог

Генератор случайных паролей на CSharp — Безопасная реализация с криптографической стойкостью

Фрагмент из «Генератор случайных паролей на CSharp»: Безопасная реализация с криптографической стойкостью.

C# main.cs
using Система;
using Система.Linq;
using Система.Безопасность.Cryptography;
using Система.Text;

public class SecurePasswordGenerator
{
    private const string Lowercase = "abcdefghijklmnopqrstuvwxyz";
    private const string Uppercase = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
    private const string Digits = "0123456789";
    private const string Special = "!@#$%^&*()_+-=[]{}|;:,.<>?";

    public static string Generate(
        int length = 12,
        bool includeLowercase = true,
        bool includeUppercase = true,
        bool includeDigits = true,
        bool includeSpecial = true)
    {
        if (length <= 0) throw new ArgumentException("Длина пароля должна быть положительной.");

        StringBuilder charsetBuilder = new();
        if (includeLowercase) charsetBuilder.Append(Lowercase);
        if (includeUppercase) charsetBuilder.Append(Uppercase);
        if (includeDigits) charsetBuilder.Append(Digits);
        if (includeSpecial) charsetBuilder.Append(Special);

        string charset = charsetBuilder.ToString();
        if (string.IsNullOrEmpty(charset))
            throw new InvalidOperationException("Набор символов не может быть пустым.");

        // Гарантируем наличие хотя бы одного символа из каждого выбранного класса
        StringBuilder password = new();
        RandomNumberGenerator rng = RandomNumberGenerator.Create();

        if (includeLowercase) password.Append(GetRandomChar(rng, Lowercase));
        if (includeUppercase) password.Append(GetRandomChar(rng, Uppercase));
        if (includeDigits) password.Append(GetRandomChar(rng, Digits));
        if (includeSpecial) password.Append(GetRandomChar(rng, Special));

        // Добавляем оставшиеся символы из общего набора
        while (password.Length < length)
        {
            password.Append(GetRandomChar(rng, charset));
        }

        // Перемешиваем символы, чтобы гарантированные символы не оказались в начале
        return ShuffleString(password.ToString rng);
    }

    private static char GetRandomChar(RandomNumberGenerator rng, string source)
    {
        byte[] randomNumber = new byte[4];
        rng.GetBytes(randomNumber);
        uint randomValue = BitConverter.ToUInt32(randomNumber, 0);
        int index = (int)(randomValue % source.Length);
        return source[index];
    }

    private static string ShuffleString(string input, RandomNumberGenerator rng)
    {
        char[] array = input.ToCharArray();
        for (int i = array.Length - 1; i > 0; i--)
        {
            byte[] randomNumber = new byte[4];
            rng.GetBytes(randomNumber);
            uint randomValue = BitConverter.ToUInt32(randomNumber, 0);
            int j = (int)(randomValue % (i + 1));
            (array[i], array[j]) = (array[j], array[i]);
        }
        return new string(array);
    }
}

// Пример использования
class Program
{
    static void Main()
    {
        string password = SecurePasswordGenerator.Generate(
            length: 16,
            includeLowercase: true,
            includeUppercase: true,
            includeDigits: true,
            includeSpecial: true
        );
        Console.WriteLine($"Безопасный пароль: {password}");
    }
}
using Система;
using Система.Linq;
using Система.Безопасность.Cryptography;
using Система.Text;

public class SecurePasswordGenerator
{
    private const string Lowercase = "abcdefghijklmnopqrstuvwxyz";
    private const string Uppercase = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
    private const string Digits = "0123456789";
    private const string Special = "!@#$%^&*()_+-=[]{}|;:,.<>?";

    public static string Generate(
        int length = 12,
        bool includeLowercase = true,
        bool includeUppercase = true,
        bool includeDigits = true,
        bool includeSpecial = true)
    {
        if (length <= 0) throw new ArgumentException("Длина пароля должна быть положительной.");

        StringBuilder charsetBuilder = new();
        if (includeLowercase) charsetBuilder.Append(Lowercase);
        if (includeUppercase) charsetBuilder.Append(Uppercase);
        if (includeDigits) charsetBuilder.Append(Digits);
        if (includeSpecial) charsetBuilder.Append(Special);

        string charset = charsetBuilder.ToString();
        if (string.IsNullOrEmpty(charset))
            throw new InvalidOperationException("Набор символов не может быть пустым.");

        // Гарантируем наличие хотя бы одного символа из каждого выбранного класса
        StringBuilder password = new();
        RandomNumberGenerator rng = RandomNumberGenerator.Create();

        if (includeLowercase) password.Append(GetRandomChar(rng, Lowercase));
        if (includeUppercase) password.Append(GetRandomChar(rng, Uppercase));
        if (includeDigits) password.Append(GetRandomChar(rng, Digits));
        if (includeSpecial) password.Append(GetRandomChar(rng, Special));

        // Добавляем оставшиеся символы из общего набора
        while (password.Length < length)
        {
            password.Append(GetRandomChar(rng, charset));
        }

        // Перемешиваем символы, чтобы гарантированные символы не оказались в начале
        return ShuffleString(password.ToString rng);
    }

    private static char GetRandomChar(RandomNumberGenerator rng, string source)
    {
        byte[] randomNumber = new byte[4];
        rng.GetBytes(randomNumber);
        uint randomValue = BitConverter.ToUInt32(randomNumber, 0);
        int index = (int)(randomValue % source.Length);
        return source[index];
    }

    private static string ShuffleString(string input, RandomNumberGenerator rng)
    {
        char[] array = input.ToCharArray();
        for (int i = array.Length - 1; i > 0; i--)
        {
            byte[] randomNumber = new byte[4];
            rng.GetBytes(randomNumber);
            uint randomValue = BitConverter.ToUInt32(randomNumber, 0);
            int j = (int)(randomValue % (i + 1));
            (array[i], array[j]) = (array[j], array[i]);
        }
        return new string(array);
    }
}

// Пример использования
class Program
{
    static void Main()
    {
        string password = SecurePasswordGenerator.Generate(
            length: 16,
            includeLowercase: true,
            includeUppercase: true,
            includeDigits: true,
            includeSpecial: true
        );
        Console.WriteLine($"Безопасный пароль: {password}");
    }
}