Exemplo n.º 1
0
        public byte[] GeneratePassword(int passwordLength, PasswordRequirement fallbackChars, params PasswordRequirement[] reqs)
        {
            var indexProvider = _cryptoRandom;
            var password = new byte[passwordLength];
            var indexes = Enumerable.Range(0, passwordLength).ToList();

            for (var i = 0; i < passwordLength; i++)
            {
                var indexPointer = indexProvider.Next(0, indexes.Count);
                var index = indexes[indexPointer];
                indexes.RemoveAt(indexPointer);
                var actual = reqs.Sum(z => z.Required - z.Used);
                var fallback = true;
                foreach (var req in reqs)
                {
                    var result = Rand(req.Used, req.Required, (passwordLength - i) - actual - req.Required - req.Used);
                    if (result)
                    {
                        var value = req.RandomValue();

                        password[index] = Encoding.UTF8.GetBytes(new[] { value }, 0, 1)[0];
                        req.Used++;
                        fallback = false;
                        break;
                    }
                }

                if (fallback)
                    password[index] = (byte)fallbackChars.RandomValue();
            }

            return password;
        }
Exemplo n.º 2
0
        public byte[] GeneratePassword(PasswordSettings settings)
        {
            var fallback = new PasswordRequirement(0, AlphaChars);
            var password = GeneratePassword(settings.Length, fallback,
                                            new PasswordRequirement(settings.MinimumNonAlphaChars, settings.MaximumNonAlphaChars, settings.IsUsKeyboard ? UsKeyboardNonAlphas : NonAlphas),
                                            new PasswordRequirement(settings.MinimumUpperCase, settings.MaximumUpperCase, UpperAlphaChars),
                                            new PasswordRequirement(settings.MinimumDigits, settings.MaximumDigits, DigitChars)
                );

            return password;
        }