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

В OutSystems мы серьезно относимся к вопросам безопасности наших клиентов; это один из наших главных приоритетов. Защита интеллектуальной собственности и предотвращение кражи и повторного использования кода третьими сторонами - это лишь некоторые из направлений, с которыми нам приходится иметь дело.

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

Минификация против обфускации

Хотя некоторые могут легко спутать и то, и другое, минификация и обфускация - это совершенно разные вещи. Согласно определению Википедии, минификация фокусируется на удалении всех ненужных символов без изменения функциональности кода.

Во время минификации весь бессмысленный код удаляется (например, пробелы, комментарии), в основном уменьшая размер файла. Для приложений, основанных на JavaScript, это, наверное, главное преимущество. Уменьшение размера файлов означает более быструю загрузку и более высокую скорость загрузки, другими словами, повышение производительности вашего приложения. Производительность может быть дополнительно увеличена при использовании минификации со сжатием gzip для передачи по сети.

Давайте посмотрим на простой фрагмент кода до и после минификации:

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

Все просто, правда? Если этого недостаточно, вы можете применить больше преобразований, чтобы сделать его еще более трудным для чтения, разделив каждый символ и заменив его шестнадцатеричным значением. Вот как это выглядит с простой строкой «Hello World»:

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

Уроки выучены

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

Стоимость безопасности

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

Время рендеринга

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

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

Размер файла

В мире мобильных устройств, в котором мы живем, объем памяти, доступный на устройстве, становится менее важной проблемой. Однако размер файла по-прежнему является проблемой, когда устройства могут легко подключаться к сетям 3G или 4G или использовать тарифные планы с побайтовой оплатой. На странице Android для разработчиков даже есть статья о том, как уменьшить размер APK.

Здесь вы можете увидеть, как применение минификации и обфускации к одному из кода нашего приложения повлияло на размер установщика.

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

Обфускация может добавить много ненужного кода, чтобы повысить его устойчивость, что и вызывает увеличение размера файла. Применение минификации к нему не очень помогает, поскольку удаляет только ненужные пробелы.

Обратите внимание, что эти числа являются результатом применения обоих методов. Если бы я применял их индивидуально, я бы получил другие результаты.

Баланс безопасности и производительности

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

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

Идеи, изложенные в этом посте, частично являются результатом исследовательского проекта RADicalize, который был поддержан ЕС и PT2020.