Допустим, у меня есть зашифрованный файл на iPhone, и каждый раз, когда я хочу его расшифровать, я хочу «нарисовать» символ дешифрования вместо того, чтобы использовать клавиатуру для его ввода.
Если вы просите пользователя нарисовать символ для расшифровки файла каждый раз, когда он необходим (например, каждый раз, когда он запускает ваше приложение), он, вероятно, предпочел бы, чтобы он набрал примерно 20 символов или около того пароля на крошечной клавиатуре. и они все равно получат защиту, которую им даст пароль из 20 символов (в зависимости от того, насколько сложна нарисованная ими форма / символ).
Символ, который они будут рисовать, скорее всего, будет одним ударом (например, он закончится после того, как вы поднимете палец вверх), но может быть очень сложным, так что кому-то еще будет трудно повторить его, даже если он увидит, как вы рисуете Вроде как то, как подпись каждого человека уникальна и ее трудно воспроизвести. На самом деле, это может слишком усложнить это, если бы оно должно было предотвратить дублирование, поэтому пока это можно игнорировать, и мы можем предположить, что символ не будет виден кому-то еще, и, таким образом, не имеет значения, можно ли его повторить ими или нет.
Полагаю, реальный вопрос заключается в том, как бы вы последовательно преобразовывали один и тот же (разумно) штрих в один и тот же ключ (например, значение хеша). Очевидно, в алгоритме должен быть некоторый порог прощения, потому что нельзя ожидать, что пользователь будет повторять удар точно на 100%.
Использование символа в качестве метода расшифровки добавляет еще одно измерение к этой проблеме. Вы никогда не захотите хранить сгенерированное хеш-значение где-либо в незашифрованном виде, потому что тогда кто-то сможет получить доступ к этой части жесткого диска и получить ключ дешифрования без необходимости проходить весь процесс рисования и дешифровать файл вручную. Вы также, скорее всего, не хотите ничего хранить о том, как нарисована фигура.
Хорошим примером штриха, который пользователь может использовать в качестве символа расшифровки, является символ «&». Представьте себе пользователя, который рисует этот символ на своем iPhone каждый раз, когда ему нужно расшифровать файл. Размер символа может не совпадать при каждом его рисовании. Кроме того, вращение символа может быть различным в зависимости от того, как пользователь держит свое устройство. В идеале, в обоих случаях, поскольку символ был нарисован относительно одинаковых штрихов пользователя, он должен иметь возможность генерировать одно и то же значение хеш-функции и, таким образом, расшифровывать файл.
Я думал, что что-то вроде формы или распознавания символов - это похожий алгоритм. Когда пользователь рисует что-то (разумно представляя форму), а затем фиксирует его на правильной форме, которая будет иметь одинаковое значение хеш-значения при каждом рисовании. Однако для чего-то подобного вам, скорее всего, понадобится база данных фигур, которые можно нарисовать, и если вы выберете что-то вроде всех букв в алфавите, вы получите только 26 букв. И если предположить, что пользователю нужно только нарисовать один символ для расшифровки файла, у вас есть крайне небезопасный пароль с 26 возможностями.
Еще одна вещь, о которой я подумал: вы можете разбить символ, который нарисован на крошечные сегменты, и затем запустить распознавание символов на них. Итак, представьте, что у вас есть 4 символа в базе данных: вертикальная линия, горизонтальная линия и диагональ в обоих направлениях. Теперь, когда пользователь рисует, каждый сегмент распознается как один из них, а затем все они объединяются для формирования некоторого значения хеш-функции. Итак, представьте, что пользователь выбрал в качестве символа расшифровки строчную букву «r». Таким образом, они начнут рисовать вертикальную линию вниз, затем вертикальную линию вверх, а затем диагональную линию вверх и вправо. Одна из проблем этого метода заключается в том, как вы узнаете, когда следует разделить черту на отдельные сегменты? Возможно, вы также захотите принять во внимание, какова длительность каждого отдельного сегмента (например, с шагом 40 пикселей). Таким образом, если кто-то нарисовал деформированную букву «r» там, где рядом с дном выходит горб, он не распознается как тот же символ и, следовательно, не расшифровывает файл.
Третьим методом может быть разделение экрана на сетку (пока не ясно, какой размер) и просто просмотр, в каких ячейках нарисован штрих, и использование этих данных для генерации строки.
Есть еще идеи, как это можно реализовать? Вы когда-нибудь слышали что-то подобное? Существуют ли какие-либо фундаментальные недостатки, которые мешали бы работе подобной системы?
Спасибо