Вопрос должен звучать так: «Сколько предположений в среднем необходимо, чтобы найти действительный ПИН-код, по сравнению с тем, сколько предположений делают злоумышленники?»
Если вы генерируете 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 заключается в том, что они распределены равномерно, что помогает здесь, так как это затрудняет угадывание кодов), и в этом случае вы могли бы просто генерировать их случайным образом.