2012-01-07 3 views
2

Пример:требуют различных символов в код Защитный код

a35sfj9ksdf 

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

+4

Почему бы не просто хеш-код и не спросить пользователя об этом? –

+0

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

+0

Возможный дубликат [Как хранить и проверять цифры, выбранные случайным образом из ПИН-кода/пароля] (http: // stackoverflow.com/questions/3388379/how-to-store-and-verify-digits-selected-at-random-from-a-pin-password) –

ответ

1

Возможность того, что было описано ни здесь, ни в How to store and verify digits chosen at random from a PIN/Password заключается в следующем:

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

Теперь вы должны хранить управляемое количество п + 1 полей для защитного кода длины п и все еще может проверить одного (положение, голец) кортежи

+0

Это довольно элегантный метод и, безусловно, гораздо более безопасен, чем хранение открытого текста или хэшей одиночных символов , Для получения лучших результатов используйте для каждой пользователя различную случайную соль. +1 –

+1

«Создайте случайную соль той же длины, что и код seucrity» и «Хранить соль с пользователем» означает именно то, что: Случайная соль для каждого отдельного пользователя. Не делайте этого, чтобы злоумышленник мог прикоснуться к таблице, чтобы найти коды безопасности, объединив частично известные другие коды, если образец достаточно большой. –

+0

Предположим, я нападавший. Итак, если я хочу знать символ x в позиции i, и у меня есть соль, то я просто вычисляю N хэшей, где N - количество возможных символов и проверьте, какой из них правильный? Это делает грубый форсинг намного проще. В основном, вы переходите от N^L к N * L по сложности (где L - длина защитного кода). Или я не понимаю метод? –

0

Что об использовании SUBSTR()?

substr("a35sfj9ksdf", 0, 1); 

Это будет возвращать 'а', первый символ

substr("a35sfj9ksdf", 4, 1); 

Это возвращение было 4, 5-й символ

Так что-то вроде, пожалуйста, введите $ н характер и использовать

substr("a35sfj9ksdf", $n-1, 1); 
0

вы можете выполнить следующие этапы:

  1. хранить все нужные символы в массиве

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

  3. Тогда CONCAT новых сгенерированных символов, чтобы сделать строку

  4. хранить строку, используя сеанс и когда спросить у пользователя просто совпадает с кодом пользователя с сеансом

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

Смежные вопросы