Как хранить и проверять произвольно выбранные цифры с помощью PIN-кода / пароля - PullRequest
4 голосов
/ 02 августа 2010

Если у меня есть пользовательский 6-значный PIN-код (или n-символьная строка), и я хочу проверить, скажем, 3 цифры, выбранные случайным образом из PIN-кода (или x символов), как часть процедуры «входа в систему», как я буду хранить ПИН-код в базе данных или некоторая зашифрованная / хешированная версия ПИН-кода таким образом, чтобы я мог проверить личность пользователя?

Мысль:

  1. Храните ПИН-код в обратимом виде (симметрично или асимметрично) в зашифрованном виде, расшифровывать для проверки цифр.
  2. Храните ряд хешированных перестановок ПИН-кода в сравнении с некоторыми ID, который ссылается на «случайный выбранные цифры, например:
    • ID: 123 = Хэш цифр 1, 2, 3
    • ID: 416 = Хэш цифр 4, 1, 6

Проблемы:

  1. Безопасность ключа: предположим, что ключ «защищенный» и что приложение не финансово ни критично, но «большой объем».
  2. Создание широкое число хеш перестановки и запредельно большой объем памяти (16 байт х несколько перестановки) и отнимает много времени, вероятно, излишним

Есть ли другие варианты, проблемы или уточнения?

Да: Я знаю хранение паролей / булавки обратимым образом является «спорной» и в идеале не должен быть сделано

.

Обновление

Только для уточнения: 1. Случайные цифры - это схема, которую я рассматриваю, чтобы избежать клавиатурных шпионов. 2. Невозможно предпринять больше попыток, чем ограниченное количество. 3. Другие элементы помогают защитить и аутентифицировать доступ.

Ответы [ 6 ]

2 голосов
/ 05 августа 2010

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

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

1 голос
/ 02 августа 2010

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

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

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

1 голос
/ 02 августа 2010

Одним из возможных решений является использование Рида-Соломона (или чего-то подобного) для построения схемы n-of-m: сгенерировать полином n-й степени f(x), где n - количество цифр, необходимое для входа в систему, и сгенерируйте цифры пин-кода, оценив f(x) в x=1..6. Объединенные цифры станут вашим полным пин-кодом. Любые три из этих цифр могут затем использоваться (вместе с их координатой x) для интерполяции полиномиальных констант. Если они равны вашим исходным константам, цифры верны.

Самая большая проблема, конечно, состоит в том, чтобы сформировать поле из чисел 0..9 для арифметики с полиномиальной константой. Обычная арифметика не будет сокращать это в этом случае. И мое конечное поле слишком ржавое, чтобы помнить, если это возможно. Если вы выберете 4 бита на цифру, вы можете использовать GF(2^4) для преодоления этого недостатка. Кроме того, невозможно выбрать ваш PIN-код. Это нужно будет назначить вам. Наконец, при условии, что вы можете решить все проблемы, для схемы 3 из n имеется только 1000 различных многочленов, и это слишком мало для обеспечения надлежащей безопасности.

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

1 голос
/ 02 августа 2010

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

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

Еще один совершенно другой аргумент состоит в том, что ваши пользователи могут быть очень смущены этой странной процедурой входа в систему:)

1 голос
/ 02 августа 2010

Поскольку 6C3 равен 20, а 10C3 равен 120, я получу ложный положительный результат (будь аутентифицирован) на 1/6 моих догадок.

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

0 голосов
/ 05 августа 2010
  • Ключ «защищен»
  • Приложение не является ни финансовым, ни крайне критичным,
  • Приложение «большого объема».
  • Созданиеширокое число перестановок хеш-функций как чрезмерно большого объема памяти (16 байт х несколько перестановок), так и отнимает много времени, вероятно, избыточно
  • Случайные цифры - это схема, которую я рассматриваю, чтобы избежать клавиатурных шпионов.
  • Невозможно выполнить более ограниченного числа повторных попыток.
  • Другие элементы помогают обеспечить безопасность и аутентифицировать доступ.

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

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

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

Пример матрицы:

  1  2  3  4  5  6  7  8
A ;  k  j  l  k  a  s  g
B f  q  3  n  0  8  u  0
C 1  2  8  e  g  u  8  -

Задача может быть: "Введите свой PIN-код, а затем символ из квадрата B3 из вашей матрицы. "

Ответ может быть следующим: 98763

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