Спустя десятилетия после появления землян на планете Плюк, на смену КС как ценнейшему ресурсу для чатланов и пацаков пришел КУ-АР.
Представители двух народов, желавшие приобрести себе в будущем малиновые штаны, нашли способ подделать этот ценный товар, в результате чего пришлось внедрить метод проверки его подлинности.
В этой статье я расскажу о том, как я разработал Android-приложение для сканирования и проверки сертификатов о прививках, а также о том, что из этого получилось в итоге.
Все начинается с чистки зубов
Некоторым людям идеи приходят в голову ночью, во сне, другие получают возможность погрузиться в «поток» во время упорной работы, а я испытываю бесконечный поток мыслей, в котором мелькают различные идеи, пока чистю зубы.Вот и в этот раз, в октябре, пока чистил зубы, на фоне массовой публикации указов с ковидными ограничениями, мне в голову пришла мысль о потенциальной возможности обхода проверки QR-кода путем использования фишинговых сайтов с поддельными сертификатами о прививках.
Тут я сразу понял, что я не один такой умный( что позже подтвердилось ), и что это потенциально может стать серьезной проблемой для полной реализации мер по борьбе с Covid. Я описал текущую ситуацию с фишинговыми сайтами, которые являются клонами страниц с данными сертификата о прививках в другом статья ранее.
На тот момент я не слышал о существовании в России других приложений, созданных специально для сертификатов о прививках, но при этом решил специально не проверять эту информацию( А что из этого получилось, вы узнаете позже.
), поэтому через два дня я начал разработку собственного решения.
Как работает приложение
Концепция приложения довольно проста.Ввод должен представлять собой содержимое QR-кода после его сканирования, после чего содержимое проверяется на предмет того, является ли оно ссылкой.
Если QR-код содержит что-то кроме ссылки, приложение должно отобразить ошибку.
Если же приложение содержит ссылку, то проверяется домен этой ссылки, а также подкаталоги и имена страниц, и если ссылка не соответствует заданным условиям, то приложение также выдает ошибку.
Если ссылка действительна, то данные сертификата запрашиваются, отображаются на экране, а также проверяются на повторное использование этого сертификата, после чего данные сохраняются в истории сканирования.
Ошибки вместе с содержимым QR-кода также сохраняются в истории сканирования, чтобы можно было оценить статистику использования.
QR-коды со скидкой на курицу .
Общий принцип применения
Процесс сканирования
Публичный репозиторий с кодом проекта доступен по адресу GitHub .Для сканирования QR-кодов я использовал библиотека на базе библиотеки ZXing .
Порядок сканирования и расшифровки QR-кода в приложении: кодСканнерПрок() , который использует метод подключенной библиотеки для декодирования содержимого QR-кода.
onDecoded() :
Внутри метода onDecoded() , в который передается содержимое QR-кода, существует переопределенный метод бегать() , который вызывает метод для проверки данных, содержащихся в QR-коде.public class MainActivity extends AppCompatActivity implements View.OnClickListener { /* code */ private void codeScannerProc(){ codeScanner.setDecodeCallback(new DecodeCallback() { @Override public void onDecoded(@NonNull final Result result) { runOnUiThread(new Runnable() { @Override public void run() { checkContent(result.getText()); } }); } }); codeScannerView.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { codeScanner.startPreview(); } }); } /* code */ }
Проверка содержимого QR-кода
Для того, чтобы отбросить любые данные, кроме ссылки на сертификат о прививке, используется метод проверкаСодержимое() , который содержит строку с содержимым QR-кода: public class MainActivity extends AppCompatActivity implements View.OnClickListener {
/* code */
private void checkContent(String str){
Date currentTime = Calendar.getInstance().
getTime();
String scanTime = String.valueOf(currentTime);
scanTime = scanTime.replace(" ", "\\");
if (!quickResponseCodeURL.isURL(str)) {
historyFileInputOutput.writeInvalidQrToFile(1, str, scanTime);
showNotSuccessScanResultAlertDialog(SCAN_RESULT_NOT_URL);
return;
}
if (!quickResponseCodeURL.isValidURL(str)) {
historyFileInputOutput.writeInvalidQrToFile(2, str, scanTime);
showNotSuccessScanResultAlertDialog(SCAN_RESULT_INVALID_URL);
return;
}
str = quickResponseCodeURL.replaceSpaces(str);
startCertificateActivity(str);
}
/* code */
}
Сначала выполняется проверка, чтобы убедиться, что содержимое вообще является ссылкой.
Для этого используется метод isURL() сорт QuickResponseCodeURL .
Метод isURL() , как и последующие методы проверки содержимого QR-кода, использует регулярное выражение для возврата результата в виде логическое значение -ценности.
Для проверки соответствия ссылки ссылке используется шаблон регулярного выражения в виде экземпляра класса Шаблон – urlPattern ( шаблон ссылки использует стандарт RFC 3986 ).
Использование класса Матчер и метод Матчи() мы получаем результат» истинный "если контент соответствует шаблону ссылки и соответственно ЛОЖЬ - во всех остальных случаях.
public class QuickResponseCodeURL {
// Pattern for recognizing a URL, based off RFC 3986
private static final Pattern urlPattern = Pattern.compile(
"(?:^|[\\W])((ht|f)tp(s?):\\/\\/|www\\.
)" + "(([\\w\\-]+\\.
){1,}?([\\w\\-.
~]+\\/?)*" + "[\\p{Alnum}.
,%_=?&#\\-+()\\[\\]\\*$~@!:/{};' ]*)",
Pattern.CASE_INSENSITIVE | Pattern.MULTILINE | Pattern.DOTALL);
Теги: #Android #разработка Android #covid-19 #qr-коды #разработка android #java #разработка android #вакцина от covid-19 #QR #qr-код #сертификаты о вакцинации
-
Т1 В Деловом Мире
19 Oct, 24 -
Что Происходит С Дизайном Продуктов Apple
19 Oct, 24 -
Symfony + Api Карт Google + Phoogle
19 Oct, 24 -
Криптографическая Защита Dns-Трафика
19 Oct, 24 -
Альтернативная «Дружественная» Капча
19 Oct, 24