Выводы

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

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

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

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

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

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

UPDATE

Прочитав все сообщения ниже, я хотел бы добавить более подробную информацию.

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

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

Благодарю всех за ваши удивительные ответы снова.

Ответ 1

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

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

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

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

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

например. Left (Sha1 (DateTime + Salt + PseudoRandom), 9)

Ответ 2

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

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

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

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

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

Ответ 3

Можно ли предложить альтернативный подход? Взгляните на Perfect Paper Passwords и производные запрошен.

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

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

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


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

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

Если вы используете версию системы Perfect Paper Passwords от John Graham-Cumming вы можете:

  • Настройте это для (скажем) 10-значных десятичных контактов
  • Выберите секретную ключевую фразу
  • Создайте (скажем) первый миллион паролей (/ПИН)

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

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

Ответ 4

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

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

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

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

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

Удачи!

Ответ 5

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

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

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

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

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

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

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

Ответ 6

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

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

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

Ответ 7

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

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

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

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

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

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

Ответ 8

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

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

Ответ 9

Должен ли я сгенерировать этот код через некоторые своего рода алгоритм?

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

Или я должен его произвольно генерировать?

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

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

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

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

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

Ответ 10

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

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

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

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

Ответ 11

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

Затем я бы сохранил каждый новый код в базе данных и дал ему сообщить об ошибках UNIQUE KEY, что произошло столкновение (дубликат). Затем продолжайте движение до тех пор, пока я не сделаю $n число успешно созданных кодов. Конечно, вы могли бы сделать это в памяти, но я хотел сохранить коды для использования в слиянии MS Word. Итак... затем я экспортировал их как CSV файл.