Пин Генерация

// Make user global
window.user = {
    name: "Some user",
    methods: {
        showGreetings: function () {
            window.alert("Hello " + this.getUserName());
        },
        getUserName: function () {
            return this.getParent().name;
        }
    }
};
// Add some JavaScript magic
(function () {
    var makeClass = function (className) {
        createClass.call(this, className);
        for (key in this[className]) {
            if (typeof this[className][key] === "object") {
                makeClass.call(this[className], key);
            }
        }
    }
    var createClass = function (className) {
        // private
        var _parent = this;
        var _namespace = className;
        // public
        this[className] = this[className] || {};
        this[className].getType = function () {
            var o = this,
                ret = "";
            while (typeof o.getParent === "function") {
                ret = o.getNamespace() + (ret.length === 0 ? "" : ".") + ret;
                o = o.getParent();
            }
            return ret;
        };
        this[className].getParent = function () {
            return _parent;
        };
        this[className].getNamespace = function () {
            return _namespace;
        }
    };
    makeClass.call(window, "user");
})();

user.methods.showGreetings();
16
задан Alec Smart 1 January 2009 в 11:18
поделиться

10 ответов

Если мы принимаем 100 000 пользовательских максимумов тогда, у них могут быть уникальные PIN с 0-99 999 т.е. 5 цифрами.

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

Это также зависит от значения того, что Вы защищаете и насколько катастрофический это было бы, если бы нечетный действительно выходил.

я пошел бы для 9 цифр, если Вы хотите сохранить его коротким или 12 цифр, если Вы хотите немного больше безопасности от автоматизированного предположения.

Для генерации PIN я взял бы высокое разрешение версия времени наряду с [приблизительно 110] соль и возможно псевдослучайное число, генерировал бы хеш и использовал бы первые 9 или 12 цифр. Удостоверьтесь, что существует разумная и случайная задержка между новыми поколениями PIN так , не генерируют их в цикле , и, если возможно делают их пользователем инициируемый.

, например, Левый (Sha1 (DateTime + Соль + PseudoRandom), 9)

4
ответ дан pro 1 January 2009 в 11:18
поделиться

Кажется, что Вы хотите использовать PIN-код в качестве единственных средств идентификации для пользователей. Осуществимое решение состояло бы в том, чтобы использовать первые пять цифр, чтобы идентифицировать пользователя и добавить четыре цифры как PIN-код.

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

0
ответ дан starblue 1 January 2009 в 11:18
поделиться

Вопрос должен быть, "сколько предположения необходимы в среднем для нахождения действительного PIN-кода, по сравнению с тем, сколько делают взломщики предположений?"

при генерации 100 000 5-разрядных кодов, тогда очевидно, требуется 1 предположение. Это вряд ли будет достаточно хорошо.

при генерации 100 000 N-разрядных кодов, тогда это берет (n-5) ^10 предположения. Чтобы удаться, достаточно хорошо ли это, необходимо рассмотреть, как система отвечает на неправильное предположение.

, Если взломщик (или, все объединенные взломщики) может высказать 1 000 предположений в секунду, то ясно n должен быть довольно большим для остановки решительного взломщика. При постоянной блокировке их IP-адреса после 3 неправильных предположений то, так как у данного взломщика вряд ли будет доступ к больше, чем, скажем, 1000 IP-адресов, n=9 были бы достаточны для срыва почти всех взломщиков. Очевидно, при направлении с распределенными нападениями или нападениями из ботнета тогда 1 000 IP-адресов на взломщика больше не являются безопасным предположением.

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

, Учитывая Ваш вариант использования карты царапины, если бы пользователи собираются использовать систему в течение долгого времени, я рекомендовал бы позволить им (или вынудить их) для "обновления" их PIN-кода до имени пользователя и пароля их выбора после первого использования системы. Тогда Вы получаете обычные преимущества имени пользователя/пароля, не отбрасывая простоту первого использования просто ввода числа от карты.

Что касается того, как генерировать число - по-видимому, каждый, который Вы генерируете, Вы сохраните, в этом случае я сказал бы, генерируют их случайным образом и удаляют дубликаты. Если Вы генерируете их использующий какой-либо вид алгоритма, и кто-то выясняет алгоритм, то они могут выяснить действительные PIN-коды. При выборе алгоритма, таким образом, что для кого-то не возможно выяснить алгоритм, то это [почти 110] генератор псевдослучайного числа (другое свойство PRNGs, являющегося этим, они равномерно распределяются, который помогает здесь также, так как это делает его тяжелее для предположения кодов), в этом случае Вы могли бы также просто генерировать их случайным образом.

2
ответ дан Steve Jessop 1 January 2009 в 11:18
поделиться

4 случайных цифры должны быть много при добавлении его к уникальному известному идентификатору пользователя (могло бы все еще быть число) [как рекомендуется starblue]

, Генератор псевдослучайных чисел должен также быть прекрасным. Можно сохранить их в DB с помощью обратимого шифрования (AES) или одностороннее хеширование

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

Больше, чем 6 цифр и люди будет забывать их, или хуже, отмечает, писание их на постэтом на их мониторе.

Принятие учетной записи блокирует с 3 неправильными попытками, затем имея 4 контакта цифры плюс Идентификатор пользователя (999999) компонента идентификатора пользователя +, Контакт (1234) дает Вам 3/10000 шанс кого-то предположение. Действительно ли это приемлемо? Если не делают длину контакта 5 и получают 3/100000

9
ответ дан nick_alot 1 January 2009 в 11:18
поделиться

Много больших ответов до сих пор: простой, эффективный, и изящный!

я предполагаю, что приложение несколько подобно лотерее, в котором каждый пользователь получает карту царапины и использует ее для выяснения у приложения, если "он уже выигран!" Так, С той точки зрения, несколько новых проблем приходят на ум:

набор номера войны , или его эквивалентный Интернет: пользователь жулика может неоднократно поражать Ваше приложение, говорить предположение каждого 10-разрядного числа по очереди? Если это - возможность, рассмотрите ограничение количества попыток от конкретного местоположения. Эффективный путь мог бы быть просто, чтобы отказаться отвечать на больше, чем, скажем, одна попытка каждые 5 секунд от того же IP-адреса. Это делает управляемые машиной нападения неэффективными и избегает проблема локаута .

проблема Локаута : при блокировке учетной записи постоянно после какого-либо количества неудачных попыток Вы подвержены к отказ в обслуживании нападения. Взломщик выше мог эффективно заблокировать каждый пользователь , если Вы не активируете аккаунты после промежутка времени. Но это - проблема, только если Ваши PIN состоят из очевидной конкатенации идентификатора пользователя + Ключ, потому что взломщик мог попробовать каждый ключ за данный идентификатор пользователя. Та техника также уменьшает Ваше ключевое пространство решительно, потому что только несколько цифр PIN действительно случайны. С другой стороны, если PIN является просто последовательностью случайных цифр, локаут должны только быть примененным к исходному IP-адресу. (Если бы попытка перестала работать, никакая действительная учетная запись не затронута, поэтому что Вы "заблокировали" бы?)

Хранение данных : если Вы действительно создаете своего рода подобную лотерее систему Вы только потребность сохранить PIN победы ! Когда пользователь вводит PIN-код, можно искать относительно маленький список PIN/призов (или эквивалент). Можно рассматривать "потерю" и недопустимые PIN тождественно с "Извините, лучшей удачей в следующий раз" сообщение или приз "по умолчанию", если экономика является правильной.

Удачи!

4
ответ дан Adam Liss 1 January 2009 в 11:18
поделиться

я должен генерировать этот код с помощью своего рода алгоритма?

номер это будет предсказуемо.

Или я должен случайным образом генерировать его?

Да. Используйте криптографический случайный генератор или позвольте пользователю выбрать их собственный PIN.

В цифрах теории 4 будет много, поскольку эмитентам карты ATM удается поддерживать очень многочисленное сообщество только с, что (и очевидно, они не могут быть и не должны быть уникальными). Однако в этом случае необходимо ограничить количество попыток введения PIN-кода и заблокировать их после этого много попыток, как банки делают. И необходимо также заставить пользователя предоставлять идентификатор пользователя (в случае ATM, это находится эффективно на карте).

, Если Вы не хотите ограничивать их таким образом, может быть лучше угробить идею PIN и использовать стандартный пароль (который является по существу, каков Ваш PIN, только с очень коротким и ограниченным набором символов). Если абсолютно необходимо ограничить его численными данными (потому что у Вас есть клавиатура PIN, или что-то) тогда рассматривают создание 4 (настраиваемая) минимальная длина, а не фиксированная длина.

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

существуют различные другие схемы, которые могут использоваться также, если можно сказать нам больше о требованиях (действительно ли это - веб-приложение? встроенная система? и т.д.).

0
ответ дан frankodwyer 1 January 2009 в 11:18
поделиться

Я могу предложить альтернативный подход? Смотрите на Идеальные Бумажные Пароли , и эти производные , это запросило.

Вы могли использовать это как есть, "" чтобы генерировать одноразовые PIN, или просто генерировать единственный PIN на пользователя.

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

(Пробег, предупреждающий: Я - определенно не специалист по безопасности.)

<час>

Вот второй ответ: от перечитывания я предполагаю, что Вы не хотите идентификатор пользователя как таковой - Вы просто проверяете ряд выпущенных карт царапины. Я также предполагаю, что Вы не хотите использовать алфавитные PIN.

необходимо выбрать длину PIN, таким образом, что вероятность предположения допустимого PIN является меньше чем 1 / (Количество попыток, которые можно защитить от). Так, например, если у Вас будет 1 миллион допустимых PIN, и Вы хотите защитить от 10 000 предположений, Вам будет нужен 10-разрядный PIN.

при использовании John Graham-Cumming's версия Идеальных Бумажных Паролей система Вы можете:

  1. Настраивают, это для (говорит), что 10-разрядные десятичные контакты
  2. Выбирают, секретный IV/ключевая фраза
  3. Генерируют (говорит) первый миллион паролей (/PIN)

, я подозреваю, что это - универсальная процедура, которая могла, например, использоваться для генерации 25-алфавитно-цифровых идентификаторов продукта, также.

Извините за выполнение его последовательным приближением; я надеюсь, что это прибывает немного ближе в то, что Вы ищете.

8
ответ дан Brent.Longborough 1 January 2009 в 11:18
поделиться

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

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

Теперь, скажем, Ваш PIN имеет энтропию N, и существует 2^M пользователи в Вашей системе ( М < N), вероятность, что случайное предположение приведет к допустимому PIN, 2^ {M-N} . (Извините за латексные нотации я надеюсь, что это достаточно интуитивно). Тогда оттуда можно определить, дана ли та вероятность низко достаточно N и M, или вычислите необходимое N от желаемой вероятности и M.

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

0
ответ дан PolyThinker 1 January 2009 в 11:18
поделиться

Я сделал это прежде с PHP и базой данных MySQL. У меня была функция перестановок, которая сначала гарантирует, что количество необходимых кодов - $n, подробно $l, с количеством символов, $c - смогло быть созданным прежде, чем запустить процесс поколения.

Затем я сохранил бы каждый новый код к базе данных и позволил бы ему сказать мне через ошибки УНИКАЛЬНОГО КЛЮЧА, что была коллизия (дубликат). Тогда продолжайте идти, пока я не сделал количество $n успешно созданных кодов. Вы могли, конечно, сделать это в памяти, но я хотел сохранить коды для использования в слиянии MS Word. Так же... тогда я экспортировал их как файл CSV.

0
ответ дан 1 January 2009 в 11:18
поделиться

Если Вы хотите генерировать PIN-коды типа платы царапины, то необходимо использовать большие количества, приблизительно 13 цифр долго; и также, они должны быть подобны номерам кредитных карт, имея контрольную сумму или цифру проверки, встроенную в само число. У Вас должен быть алгоритм для генерации контакта на основе некоторых исходных данных, которые могут быть последовательностью чисел. Получающийся контакт должен быть уникальным для каждого числа в последовательности, так, чтобы, если Вы генерируете 100 000 PIN-кодов, они все отличались. Таким образом, Вы будете в состоянии проверить число не только путем проверки его по базе данных, но и можно проверить его сначала.

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

  • Готовят пространство 12 цифр
  • Формат число как пять цифр (00000 к 99 999) и распространяют его вдоль пространства определенным способом. Например, номер 12345 может быть распространен как __ 3_5_2_4 __ 1. Можно варьироваться способ, которым Вы распространяете число в зависимости от того, является ли это четным или нечетным числом, или несколько из 3, и т.д.
  • На основе значения определенных цифр, генерируют больше цифр (например, если третья цифра даже, то создайте нечетное число и поместите его в первое открытое пространство, иначе создайте четное число и поместите его во второе открытое пространство, например, _83_5_2_4 __ 1
  • , Как только Вы генерировали 6 цифр, у Вас будет только одно открытое пространство. Необходимо всегда покидать то же открытое пространство (например, предпоследнее пространство). Вы поместите цифру проверки в то место.
  • Для генерации цифры проверки необходимо выполнить некоторые арифметические операции на числе, которое Вы генерировали, например, добавив все цифры в нечетных положениях и умножив их на некоторое другое число, затем вычтя все цифры в ровных положениях, и наконец добавив все цифры вместе (необходимо варьироваться алгоритм немного на основе значения определенных цифр). В конце у Вас есть цифра проверки, которую Вы включаете в сгенерированный PIN-код.

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

Это не звучит настолько хорошим, потому что это похоже на безопасность через мрак, но это - единственный способ, которым можно использовать это. Для кого-то не невозможно предположить PIN-код, но быть 12-разрядным кодом с цифрой проверки, это будет очень твердо, так как необходимо попробовать 1,000,000,000,000 комбинаций, и у Вас просто есть 100 000 действительных PIN-кодов, таким образом, для каждого действительного PIN-кода существует 10 000 000 недопустимых.

я должен упомянуть, что это полезно для доступных PIN-кодов; человек использует один из этих кодов только однажды, например, для зарядки заранее оплаченного телефона. Это не хорошая идея использовать эти контакты в качестве аутентификационных маркеров, особенно если это - единственный способ аутентифицировать кого-то (Вы никогда не должны аутентифицировать кого-то только через единственную часть данных; очень минимальным является username+password)

1
ответ дан Chochos 1 January 2009 в 11:18
поделиться
Другие вопросы по тегам:

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