Вопрос

Я хочу разработать систему, в которой мне нужно присвоить каждому пользователю уникальный pin-код для обеспечения безопасности.Пользователь вводит этот pin-код только для того, чтобы идентифицировать себя.Таким образом, я не хочу, чтобы пользователь мог угадать пинкод другого пользователя.Предполагая, что максимальное количество пользователей, которые у меня будут, равно 100000, какой длины должен быть этот pin-код?

например ,1234 4532 3423

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

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

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

большое вам спасибо.

Обновить

Прочитав все посты ниже, я хотел бы добавить еще несколько деталей.

  1. То, чего я пытаюсь добиться, - это чего-то очень похожего на скретч-карту.
  2. Пользователю выдается карта, которую он должен поцарапать, чтобы найти pin-код.
  3. Теперь, используя этот pin-код, пользователь должен иметь возможность получить доступ к моей системе.

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

еще раз спасибо вам всем за ваши замечательные ответы.

Это было полезно?

Решение

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

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

Это также зависит от ценности того, что вы защищаете, и от того, насколько катастрофичным было бы, если бы лишний все-таки выбрался наружу.

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

Чтобы сгенерировать ПИН-коды, я бы взял высокое разрешение версия того времени вместе с некоторыми соль и, возможно, псевдослучайное число, генерирующее хэш и используйте первые 9 или 12 цифр.Убедитесь, что существует разумная и случайная задержка между новыми поколениями контактов, чтобы не генерируйте их в цикле, и, если возможно, сделайте их инициированными пользователем.

например.Слева (Sha1(Дата-время + Соль + псевдослучайность), 9)

Другие советы

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

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

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

Любая цифра длиной более 6 цифр приведет к тому, что люди забудут их или, что еще хуже, запишут в виде стикера на своем мониторе.

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

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

Вы могли бы использовать это "как есть" для генерации одноразовых PIN-кодов или просто для генерации одного PIN-кода для каждого пользователя.

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

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


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

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

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

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

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

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

Пока что много отличных ответов:просто, эффективно и элегантно!

Я предполагаю, что приложение в чем-то похоже на лотерею, поскольку каждый пользователь получает скретч-карту и использует ее, чтобы спросить ваше приложение, "он уже выиграл!" Итак, с этой точки зрения, на ум приходит несколько новых вопросов:

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

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

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

Удачи вам!

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

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

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

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

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

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

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

Если вы используете алгоритмы генератора случайных чисел, поэтому у вас никогда не будет PIN-кода типа "00038384882", начинается с 0 (нулей), потому что целые числа никогда не начинаются с "0".ваш PIN-код должен начинаться с цифр 1-9, кроме 0.

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

Я думаю, вам нужно поместить числа 0-9 в хэш, получить их случайным образом из хэша и создать свой строковый PIN-код.

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

Я когда-то написал кое-что для этой цели, я не могу дать вам код, но общая идея такова:

  • Подготовьте пробел из 12 цифр
  • Отформатируйте число в виде пяти цифр (от 00000 до 99999) и распределите его по пробелу определенным образом.Например, число 12345 может быть распределено следующим образом __3_5_2_4__1.Вы можете варьировать способ распределения числа в зависимости от того, четное это число или нечетное, кратное 3 и т.д.
  • Основываясь на значении определенных цифр, сгенерируйте больше цифр (например, если третья цифра четная, то создайте нечетное число и поместите его в первый открытый пробел, в противном случае создайте четное число и поместите его во второй открытый пробел, например_83_5_2_4__1
  • Как только вы сгенерируете 6 цифр, у вас останется только одно открытое пространство.Вы всегда должны оставлять одно и то же открытое пространство (например, предпоследнее).Вы разместите проверочную цифру в этом месте.
  • Чтобы сгенерировать проверочную цифру, вы должны выполнить некоторые арифметические операции над сгенерированным вами числом, например, сложить все цифры в нечетных позициях и умножить их на какое-то другое число, затем вычесть все цифры в четных позициях и, наконец, сложить все цифры вместе (вы должны немного изменить алгоритм в зависимости от значения определенных цифр).В итоге у вас есть проверочная цифра, которую вы включаете в сгенерированный pin-код.

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

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

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

Похоже, вы хотите использовать pin-код в качестве единственного средства идентификации для пользователей.Приемлемым решением было бы использовать первые пять цифр для идентификации пользователя и добавить четыре цифры в качестве PIN-кода.

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

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

Нет.Это будет предсказуемо.

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

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

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

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

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

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

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

Как упоминалось в некоторых ответах, вам нужно сделать ваш PIN-код достаточно случайным, независимо от того, хотите ли вы сгенерировать его с помощью алгоритма.Случайность обычно измеряется с помощью энтропия из БУЛАВКИ.

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

Существуют различные способы генерации ПИН-кодов, чтобы вам не приходилось запоминать каждый сгенерированный вами ПИН-код.Но вам понадобится очень длинная БУЛАВКА, чтобы закрепить ее.Вероятно, это не то, чего вы хотите.

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top