Способ обезопасить использование приложения - lanit-tercom-school/grouplock GitHub Wiki
Спустя какое-то продолжительное время активного использования приложения шифрования, у пользователя может накопиться немалое число зашифрованных изображений, а также огромное количество QR-кодов, которые, вероятнее всего, будут храниться и в галерее смартфона, и на сторонних носителях, включая распечатанный вид.
Таким образом, возможна следующая неприятная ситуация:
Настал день X, и люди собрались расшифровать изображение, но среди их числа нашёлся минимум один, который облажался с хранением своего QR-кода и не знает, какой QR-код у него в галерее является требуемым, или он случайно предоставил для считывания не тот. Если код будет абсолютно другого формата (например, в нем будет зашифрована ссылка на сайт и т.п.), то без проблем можно это выявить, сообщить пользователю об ошибке и предоставить ему возможность использовать другой QR-код. А вот что делать, если код верного формата, но является ключом к другой картинке? Тогда у нас приложение выдаст неверно расшифрованное изображение, либо программа вообще аварийно завершится.
То есть появляется необходимость проверки того, является ли данный код ключом к расшифровке данной картинки.
Получается, надо поместить некий идентификационный номер и в QR-код, и в зашифрованное изображение.
Как поместить этот номер в QR-код - вопросов, естественно, не возникает, просто зашифровываем его там вместе с "секретом", разделив их, допустим, знаком "_". Но вот как зашифровать идентификационный номер в изображении?
Вариант, в котором он записывается в названии файла, считаю неудачным, потому что файл легко переименовать. Наиболее выгодным в данной ситуации считаю воспользоваться стеганографией и разместить нужную нам информацию в самом изображении (то, как это делается, можно прочитать здесь). Считаю, что лучше всего будет отвести 4 бита компоненты цвета под текст, чтобы и в глаза не бросалась данная часть картинки, и можно было разместить значительное количество информации в меньшем количестве пикселей. Таким образом, в 2 пикселях, мы сможем зашифровать 3 символа.
Посмотрев примеры в статье, указанной выше, можно заметить, что при заимствовании последних бит компонент цветов, получаемый результат вполне приемлем. Но данные об изображении нам требуется поместить в уже зашифрованную картинку, и вот тут может появиться проблема из-за того, что при изменении 12 битов, мы можем обратно не получить даже похожий цвет. В итоге, у нас будет восстановленное изображение явно испорченное местами. В данном случае, выходом из сложившейся ситуации могут стать еще один или несколько рядов пикселей, которые будут добавлены в самое начало, и при этом являющихся копиями последующих рядов. Вот как раз в них и можно помещать необходимую нам информацию.
Теперь, собственно, какую информацию стоит туда помещать.
GrLo_DeviceID_ImgID
"GrLo"- будет показывать, что файл является зашифрованным.
"DeviceID"- 16-значный идентификационный номер устройства, на котором производилось шифрование файла
"ImgID" - 5-значный порядковый номер зашифрованного файла на данном устройстве (00000,00001, и т.д.).
То есть всего будет 27 символов, которые можно зашифровать в 18 пикселях. И этот код будет однозначно определять наше зашифрованное изображение, правда, не совсем надежно правило выбора последних 5-ти знаков, т.к. при удалении и повторной установке приложения, счётчик обнулится и будут получаться изображения с повторными номерами. Тут, естественно, можно придумать нечто понадёжнее)
Запись QR-кода будем аналогичной, но с добавлением порядкового номера кода, т.е.:
GrLo_DeviceID_ImgID_QrID_Secret, где
"QrID" - 2-значный порядковый номер (00,01 и т.д.)
"Secret" - сам секрет, необходимый к дешифровке.
Таким образом, пользователям будет намного проще при возникновении, описанных в начале статьи, проблем. К тому же, записывая в зашифрованное изображение дополнительную информацию, получим 2 преимущества:
-
Нам не надо будет, при добавлении файлов в папки Encrypt и Decrypt, указывать куда именно их помещать, приложение само сможет это определять.
-
Будет возможность несколько раз шифровать один и тот же файл, и при этом не понадобится запоминать это количество раз или перетаскивать его в папку "Encrypted" обратно, после процесса дешифровки оно будет помещено обратно.
Но тут возникает вопрос, как тогда будет выглядеть процесс повторного шифрования уже зашифрованного файла, если он уже находится в папке "Encrypted". Но это скорее головная боль дизайнерам приложения, в плане реализации - всё тривиально.