Генерация надежного пароля в C #?

Короткий ответ

__all__ влияет на операторы from import *.

Длинный ответ

Рассмотрим этот пример:

foo
├── bar.py
└── __init__.py

В foo/__init__.py:

  • (Неявный) Если мы не определим __all__, тогда from foo import * будет импортировать имена, определенные в foo/__init__.py.
  • (Явно) Если мы определим __all__ = [], то from foo import * ничего не импортирует.
  • (Явно) Если мы определим __all__ = [ , ... ], тогда from foo import * будет импортировать только эти имена.

Обратите внимание, что в неявном случае python не будет импортировать имена, начинающиеся с _. Однако вы можете принудительно импортировать такие имена с помощью __all__.

Здесь вы можете просмотреть документ Python здесь .

29
задан Community 23 May 2017 в 11:46
поделиться

8 ответов

Я только что попробовал следующее в linqpad:

System.Web.Security.Membership.GeneratePassword(25, 10)

Вот пароль, который я получил:

[XTJ_67g.i/ag1rL)6_Yv>*+%

Или, если это недостаточно надежно, попробуйте следующее:

System.Web.Security.Membership.GeneratePassword(128, 100)

что дало мне следующее, когда я выполнил это три раза:

|c^.:?m)#q+(]V;}[Z(})/?-;$]+@!|^/8*_9.$&.&!(?=^!Wx?[@%+&-@b;)>N;&+*w[>$2+_$%l;+h+#zhs^{e?&=*(}X_%|:}]]}*X[+)Er%J/-=;Q0{:+=%c7:^$

/:_)hxF+*){2|;(>:*N^+!_&|}B.$})?[V=[+v({-:-@9-Z$j?.[-}(@MHx+}(}Mz_S(7#4}{..>@G|!+++{+C=|_}=+r^@&$0;L*|kz-;$++/N3$=}?;%&]]*/^#^!+

:*{]-x^$g{|?*))_=B@^.#%L;g|+)#[nq}?y(_(m;]S^I$*q=l-[_/?}&-!k^(+[_{Z|&:^%!_)!=p%=)=wYd-#.UP$%s1{*l%+[%?!c+7=@=.;{+M)!^}&d/]{];(&}

это заняло намного меньше секунды, btw. Фреймворк - ваш друг.

См. http://msdn.microsoft.com/en-us/library/system.web.security.membership.generatepassword.aspx

75
ответ дан Çağdaş Tekin 23 May 2017 в 11:46
поделиться

Я не знаю, поможет ли это вам, но это то, что я использую, когда хочу сгенерировать случайный пароль, который также является надежным. Это быстро и просто для реализации / понимания и не так уж и излишне, как в случае с провайдером членства выше ...

    private string Token(byte Length) {
        char[] Chars = new char[] {
            'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z',
            'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z',
            '0', '1', '2', '3', '4', '5', '6', '7', '8', '9'
        };
        string String = string.Empty;
        Random Random = new Random();

        for (byte a = 0; a < Length; a++) {
            String += Chars[Random.Next(0, 61)];
        };

        return (String);
    }
6
ответ дан Gup3rSuR4c 23 May 2017 в 11:46
поделиться

Чтобы ответить на ваш вопрос об этой формуле:

Формула говорит, что пароль длиной L, взятый из алфавита из N символов, эквивалентен паролю длины H, взятому из алфавита из два символа. Так, если у вас есть, скажем, 64 символа (скажем, abc ... xyzABC ... XYZ01 ... 89_!) И пароль имеет длину 10 символов, то это обеспечивает вам эквивалентную безопасность для пароля 10 log2 длиной 64 = 60 символов взяты из алфавита "ab".

«Журнал» - это обратная операция возведения в степень. От двух до шестой степени вы получаете шестьдесят четыре, поэтому «бревно два» из шестидесяти четырех дает вам шесть.

9
ответ дан Eric Lippert 23 May 2017 в 11:46
поделиться

Не уверен, где я нашел это, но вот класс для генерации действительно энтропийных, действительно случайных строк, которые можно использовать в качестве паролей.

using System.Security.Cryptography;
using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;

public class PasswordGenerator
{
    public int MinimumLengthPassword { get; private set; }
    public int MaximumLengthPassword { get; private set; }
    public int MinimumLowerCaseChars { get; private set; }
    public int MinimumUpperCaseChars { get; private set; }
    public int MinimumNumericChars { get; private set; }
    public int MinimumSpecialChars { get; private set; }

    public static string AllLowerCaseChars { get; private set; }
    public static string AllUpperCaseChars { get; private set; }
    public static string AllNumericChars { get; private set; }
    public static string AllSpecialChars { get; private set; }
    private readonly string _allAvailableChars;

    private readonly RandomSecureVersion _randomSecure = new RandomSecureVersion();
    private int _minimumNumberOfChars;

    static PasswordGenerator()
    {
        // Define characters that are valid and reject ambiguous characters such as ilo, IO and 1 or 0
        AllLowerCaseChars = GetCharRange('a', 'z', exclusiveChars: "ilo");
        AllUpperCaseChars = GetCharRange('A', 'Z', exclusiveChars: "IO");
        AllNumericChars = GetCharRange('2', '9');
        AllSpecialChars = "!@#%*()$?+-=";

    }

    public PasswordGenerator(
        int minimumLengthPassword = 15,
        int maximumLengthPassword = 20,
        int minimumLowerCaseChars = 2,
        int minimumUpperCaseChars = 2,
        int minimumNumericChars = 2,
        int minimumSpecialChars = 2)
    {
        if (minimumLengthPassword < 15)
        {
            throw new ArgumentException("The minimumlength is smaller than 15.",
                "minimumLengthPassword");
        }

        if (minimumLengthPassword > maximumLengthPassword)
        {
            throw new ArgumentException("The minimumLength is bigger than the maximum length.",
                "minimumLengthPassword");
        }

        if (minimumLowerCaseChars < 2)
        {
            throw new ArgumentException("The minimumLowerCase is smaller than 2.",
                "minimumLowerCaseChars");
        }

        if (minimumUpperCaseChars < 2)
        {
            throw new ArgumentException("The minimumUpperCase is smaller than 2.",
                "minimumUpperCaseChars");
        }

        if (minimumNumericChars < 2)
        {
            throw new ArgumentException("The minimumNumeric is smaller than 2.",
                "minimumNumericChars");
        }

        if (minimumSpecialChars < 2)
        {
            throw new ArgumentException("The minimumSpecial is smaller than 2.",
                "minimumSpecialChars");
        }

        _minimumNumberOfChars = minimumLowerCaseChars + minimumUpperCaseChars +
                                minimumNumericChars + minimumSpecialChars;

        if (minimumLengthPassword < _minimumNumberOfChars)
        {
            throw new ArgumentException(
                "The minimum length of the password is smaller than the sum " +
                "of the minimum characters of all catagories.",
                "maximumLengthPassword");
        }

        MinimumLengthPassword = minimumLengthPassword;
        MaximumLengthPassword = maximumLengthPassword;

        MinimumLowerCaseChars = minimumLowerCaseChars;
        MinimumUpperCaseChars = minimumUpperCaseChars;
        MinimumNumericChars = minimumNumericChars;
        MinimumSpecialChars = minimumSpecialChars;

        _allAvailableChars =
            OnlyIfOneCharIsRequired(minimumLowerCaseChars, AllLowerCaseChars) +
            OnlyIfOneCharIsRequired(minimumUpperCaseChars, AllUpperCaseChars) +
            OnlyIfOneCharIsRequired(minimumNumericChars, AllNumericChars) +
            OnlyIfOneCharIsRequired(minimumSpecialChars, AllSpecialChars);
    }

    private string OnlyIfOneCharIsRequired(int minimum, string allChars)
    {
        return minimum > 0 || _minimumNumberOfChars == 0 ? allChars : string.Empty;
    }

    public string Generate()
    {
        var lengthOfPassword = _randomSecure.Next(MinimumLengthPassword, MaximumLengthPassword);

        // Get the required number of characters of each catagory and 
        // add random charactes of all catagories
        var minimumChars = GetRandomString(AllLowerCaseChars, MinimumLowerCaseChars) +
                        GetRandomString(AllUpperCaseChars, MinimumUpperCaseChars) +
                        GetRandomString(AllNumericChars, MinimumNumericChars) +
                        GetRandomString(AllSpecialChars, MinimumSpecialChars);
        var rest = GetRandomString(_allAvailableChars, lengthOfPassword - minimumChars.Length);
        var unshuffeledResult = minimumChars + rest;

        // Shuffle the result so the order of the characters are unpredictable
        var result = unshuffeledResult.ShuffleTextSecure();
        return result;
    }

    private string GetRandomString(string possibleChars, int lenght)
    {
        var result = string.Empty;
        for (var position = 0; position < lenght; position++)
        {
            var index = _randomSecure.Next(possibleChars.Length);
            result += possibleChars[index];
        }
        return result;
    }

    private static string GetCharRange(char minimum, char maximum, string exclusiveChars = "")
    {
        var result = string.Empty;
        for (char value = minimum; value <= maximum; value++)
        {
            result += value;
        }
        if (!string.IsNullOrEmpty(exclusiveChars))
        {
            var inclusiveChars = result.Except(exclusiveChars).ToArray();
            result = new string(inclusiveChars);
        }
        return result;
    }
}

internal static class Extensions
{
    private static readonly Lazy<RandomSecureVersion> RandomSecure =
        new Lazy<RandomSecureVersion>(() => new RandomSecureVersion());
    public static IEnumerable<T> ShuffleSecure<T>(this IEnumerable<T> source)
    {
        var sourceArray = source.ToArray();
        for (int counter = 0; counter < sourceArray.Length; counter++)
        {
            int randomIndex = RandomSecure.Value.Next(counter, sourceArray.Length);
            yield return sourceArray[randomIndex];

            sourceArray[randomIndex] = sourceArray[counter];
        }
    }

    public static string ShuffleTextSecure(this string source)
    {
        var shuffeldChars = source.ShuffleSecure().ToArray();
        return new string(shuffeldChars);
    }
}

internal class RandomSecureVersion
{
    //Never ever ever never use Random() in the generation of anything that requires true security/randomness
    //and high entropy or I will hunt you down with a pitchfork!! Only RNGCryptoServiceProvider() is safe.
    private readonly RNGCryptoServiceProvider _rngProvider = new RNGCryptoServiceProvider();

    public int Next()
    {
        var randomBuffer = new byte[4];
        _rngProvider.GetBytes(randomBuffer);
        var result = BitConverter.ToInt32(randomBuffer, 0);
        return result;
    }

    public int Next(int maximumValue)
    {
        // Do not use Next() % maximumValue because the distribution is not OK
        return Next(0, maximumValue);
    }

    public int Next(int minimumValue, int maximumValue)
    {
        var seed = Next();

        //  Generate uniformly distributed random integers within a given range.
        return new Random(seed).Next(minimumValue, maximumValue);
    }
}

Потребляйте в своем коде таким образом:

var generator = new PasswordGenerator();
string password = generator.Generate();
Console.WriteLine(password);
8
ответ дан Richard 23 May 2017 в 11:46
поделиться

Я бы сам использовал Guid :) и заставлял пользователя редактировать пароль после входа в систему

0
ответ дан Ash 23 May 2017 в 11:46
поделиться

Как насчет Guid.NewGuid().ToString();?

1
ответ дан Nifle 23 May 2017 в 11:46
поделиться

Почему бы просто не заполнить массив несколькими символами и выбрать случайным образом их количество? Вы можете разделить их на группы, чтобы быть уверенными, что они включают буквы, цифры и специальные символы.

Вам также нужно будет выбрать правильную длину и количество из каждой группы символов для включения и все. Я не думаю, что вам нужны сложные формулы.

1
ответ дан anthares 23 May 2017 в 11:46
поделиться

Для систем, которые не допускают сгенерированные пользователем пароли, на самом деле это очень просто: любой пароль так же надежен, как и длинный. Не считая, конечно, людей, которые прикрепляют сообщения к мониторам и т. Д.

Вы, вероятно, хотите максимизировать набор символов, из которых генерируется пароль. Но ограничение сгенерированных паролей значительно уменьшает пространство поиска и, следовательно, делает пароль менее безопасным . Опять же, это верно только в том случае, если пользователь не может выбрать собственный пароль.

Если вы имеете дело как с сгенерированными, так и с пользовательскими паролями, то все ставки, очевидно, отменены. Тогда вы, вероятно, захотите сгенерировать пароли таким образом, чтобы в нем использовалось как можно больше символов из разных классов, что напоминало бы надежный пароль, выбранный пользователем. В идеале он должен соответствовать тем же ограничениям, что и пароль, созданный пользователем, также должен пройти (если есть).

1
ответ дан Joey 23 May 2017 в 11:46
поделиться
Другие вопросы по тегам:

Похожие вопросы: