Как зашифровать js файл

Обновлено: 04.07.2024

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

1. защитить страницы и текст на этих страницах, это же означает защитить html код;
2. защитить код javascript от просмотра;
3. защитить исходники с кодом php на самом сервере.

В данной статье я коснусь вопроса о способах защиты js кода. А что касается защиты html и php кода, то постараюсь посвятить этим вопросам свои следующие статьи.
Итак, начнем сразу с главного ответа на вопрос о том можно ли защитить js код от просмотра. Ответ негативный, пока еще не существует универсального способа позволяющего скрыть код js от любого желающего его посмотреть посетителя. Но, существует масса способов сделать практически невозможным понять логику и читабельность js кода, который можно подвергнуть различного вида ухищренным модификациям.
Короче говоря, его можно сделать непонятным и нечитаемым.

В интернете существует несколько основных способов модификации javascript кода:
- замена имен функций и переменных на случайные;
- удаление комментариев и преобразование скрипта в непрерывную строку;
- шифрование отдельных функций и всего скрипта.

Как вы понимаете, если нельзя защитить свой js код на 100%, то необходимо усложнить его хотя бы на 99%.
Перейдем к инструментам, которые это могут сделать. Существует несколько видов программных средств для усложнения кода javascript:

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

Еще можно запихать все JavaScript'ы в flash программу и выполнять от туда через externalinterface. Например:

var js_1:String = "function(a,b,c) "var value = (a + b) ^ c;" +
"alert('value: ' + value);" +
"return value;"+
>";

Если из таких функций сделать присваивание глобальным переменным весяшим на document то они будут доступны))) (я так текст прятал во флешки) саму флешку можно защитить с помошью secureSWF.


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

Обфусцированный скрипт

Теория

  • HTML-код страницы;
  • JavaScript-код/JS-файлы страницы;
  • CSS-код/CSS-файлы страницы;
  • Изображения и другую информацию (только в браузерах, поддерживающих протокол «data»).
  • антивирусов (если речь идет об iframe или других вредоносных скриптах);
  • других людей (например, если ты написал чудесный скрипт на JavaScript и не хочешь, чтобы кто-то его «содрал» себе).


Работа JJEncode

Базовое шифрование HTML/CSS

Что делать, если нам нужно зашифровать HTML или CSS код? Все просто: зашифровать на JavaScript, а после расшифровки вставить как HTML код.
Пример вставки (без шифровки/крипта/обфускации):


Точно так же мы поступим и с CSS-стилями:


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


Прячем слово «][akep» в теле документа

Замена атрибутов тега <script>

Все очень просто, но это нельзя считать хорошей или даже средней защитой, так как она ориентирована на невнимательность пользователей.
Сам принцип донельзя прост. Мы имеем страничку («index.html») и JavaScript-файл, код которого мы хотим скрыть («script.js»). На странице «index.html» у нас указано:


А теперь просто создадим папку «text», в которую положим наш скрипт («script.js») под именем «javascript» и поменяем атрибуты местами. Это будет выглядеть так:


Для лучшего эффекта сразу отвлечем внимание пользователя на путь. Например, так:


Проверено на личном опыте: работает отлично! Таким способом я сам накручивал партнерку по кликам, так как пришлось использовать накрутчик на JavaScript. Администрация партнерки его так и не увидела :).

JavaScript-обработчики

Данный способ также не является универсальным средством для сокрытия JS-кода, но все же я расскажу о нем. Главная идея состоит в том, чтобы прятать код внутрь обработчиков событий onLoad, onClick и т.д. То есть примерно в следующие конструкции:


Например, для тегов body и frameset есть обработчик onLoad, который запустит в нем прописанный код после загрузки страницы/фрейма.
Отмечу, что не для всех объектов обработчики одинаковы.

Cookie, Referrer и адрес

JavaScript можно также спрятать и в такие нестандартные места, как cookie (document.cookie), реферрер (document.referrer) и адрес страницы (location.href). В данном случае код будет храниться как обычный текст, а выполняться с помощью функции eval(), которая берет в качестве аргумента текст и выполняет его как JavaScript-код.
В качестве примера примем такое допущение, что у нас уже установлены кукисы следующего вида:


Теперь выполним этот алерт следующим образом:


Здесь мы берем текст всех cookie-записей для нашего хоста и делим его на части в местах, где стоит «||». Затем берем второй элемент ([1]) и запускаем его через eval().
Данный способ не так уж и плох, так как код, который мы хотим исполнить, не виден на самой странице, а также потому, что мы можем заставить код удалить самого себя! Пример реализации:


Аналогичным образом можно использовать и другие строки, доступные через JavaScript, например, location.href и document.referrer.

Сокрытие кода на Ajax

Нуллбайт атакует Оперу

Этот метод прост и достаточно эффективен, но, к сожалению, он рассчитан только на браузер Opera. Суть метода в том, чтобы перед скрываемым кодом поставить так называемый нуллбайт (нуллбайт или nullbyte — это символ с ASCII кодом «0»). Зачем? Затем, что Opera просто-напросто не показывает код во встроенном просмотрщике после данного символа. Пример:


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

Прячемся в HTML-коде и комментариях

Код можно легко спрятать в HTML, затем обработать его и выполнить. Например, вот так:


В данном случае мы спрятали код в атрибутах тега img, после чего обработали код всей страницы, собирая разбросанные кусочки. Таким же способом можно скрывать текст в HTML/JavaScript комментариях:


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

Субституция стандартных функций/методов JavaScript

Данный метод ориентирован на то, чтобы вместо стандартных функций или методов JavaScript подставить свои переменные:

  1. document.getElementsByTagName
  2. document['getElementsByTagName']

Флуд комментариями и кодом

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


В данном случае флуд комментариями слишком плотный, хотя на самом деле код был очень простым: « a = "hahaha"; alert(a); ».
Флуд кодом можно также мешать с флудом комментариями. При желании можно написать PHP-функцию для добавления флуда в код JavaScript. Лично я брал какую-то статью с английского блога, парсил на слова, и функция добавляла случайное количество этих слов в комментарии.
Кстати, желательно также использовать многострочные комментарии в форме «фальшивого закрытия»:


Какое из чисел покажет алерт? :)


Работа обфусцированного алерта

Замена текста шестнадцатеричными кодами

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


В данном случае мы — во-первых, использовали внутреннюю переменную «cookie» объекта «document», как элемент массива. Во-вторых, мы перевели ее имя в шестнадцатеричный формат. Если бы мы использовали переменную «cookie» через точку, то есть как document.cookie, то мы бы не смогли перевести обращение к ней в шестнадцатеричный формат, так как это относится только к строкам (в массиве ключ является строкой), а в document.cookie строк нет.
PHP-функция перевода в шестнадцатеричный формат:

Трюк с несуществующими функциями

Как мы уже знаем из прочитанного выше, в JavaScript можно вызывать методы, как элементы обьекта: document.getElementById и document['getElementById']. Оба варианта фактически одинаковы, различие есть только в записи — во втором варианте мы используем строку.
Как-то вечером я придумал очень интересный способ получения подобных строк. Например, нам нужно зашифровать вышеупомянутый «getElementById». Отвлечемся на короткое объяснение данного способа с помощью такого примера:


Этот скрипт не будет работать, так как функции b, c и d не были ранее объявлены. Теперь попробуем сделать так, чтобы этот код заработал, для этого будем использовать «песочницу» конструкции try<>catch()<>:


После запуска мы увидим ошибку, а это значит, что, хоть код и не является рабочим, он не остановил выполнение оставшейся корректной части.
А вот теперь мы зададимся вопросом, как такая схема может быть связана с шифрованием строки «getElementById»? А вот так:


После выполнения этого кода у нас получится строка «getElementById», содержащаяся в переменной «x».
В чем соль этого метода? В том, что эвристический анализ антивирусов при нахождении функций будет ругаться на то, что они не существуют. Тем самым мы обфусцируем код не на уровне шифровки строк разными способами, а на уровне получения данных строк от самого JavaScript.

Числа с помощью оператора «

» (тильда) является битовым отрицанием и используется вот так: «alert(

13);». Этот код выведет нам «-14». Работает данный оператор по принципу «-(число+1)».
Представим, что мы хотим присвоить переменной «a» какое-нибудь число, причем нигде это число не писать: «a =

[]»;
Данный код присвоит переменной «a» число «-1». Почему? Потому что массив представляет собой нейтральный элемент с числовым значением «0», следовательно,

0 равносильно «-(0+1)», то бишь -1.
Примеры других преобразований:

Буквы и строки без строковых данных


В данном примере переменная «a» будет содержать текст «code». Разберем подробнее. Попробуй исполнить вот такой код: «alert(alert+'');». Ты увидишь что-то вроде «function alert() < [native code] >». Тем самым, использовав всего-навсего два раза функцию alert(), мы получили совершенно другие символы.
Теперь постараемся понять, как это все работает. Представим, что у каждого объекта, функции и всего остального в JavaScript есть некое «описание». Чтобы получить к нему доступ, нужно явно изменить тип данного объекта или функции на строковой, присоединив, например, пустую строку (+"").

Шифровка строк

Для шифровки/расшифровки строк в JavaScript существуют несколько полезных функций. Разберем некоторые из них:


Также есть два метода объекта String, которые работают с преобразованием символа в ASCII-код и наоборот:


Стоит учесть, что строки можно преобразовывать еще и регулярными выражениями в сочетании с методами .match и .replace. Другие методы можно отнести, скорее, к поиску по строке.

Преобразование объектов/переменных

Имена объектов и переменных можно также преобразовать в строку (например, чтобы потом эту строку зашифровать). Преобразование происходит по тому же принципу, что и преобразование имен методов, то есть с помощью перехода из формы «.метод» в форму «[метод]». Для корректного преобразования нужно найти еще более высокий в иерархии объектов элемент, который бы имел внутри себя слово «document». Имя ему this. Согласно стандартам JavaScript, this не является объектом, а является оператором, возвращающим ссылку на объект. В результате теперь мы можем безболезненно использовать getElementById таким образом: «this[«document»][«getElementById»]».

Привязка кода

Избегание подозрительных функций

Советую также избегать явное использование функций eval(), document.write() и других. При поиске настоящего кода люди часто используют метод подстановки alert() вместо данных функций, так как после этого код можно сразу прочитать таким, каким мы его начинали шифровать, следовательно, весь смысл обфускации пропадает. Как же выполнить код, не используя фунцкию eval()?
Вспомним про то, что во главе всего стоит оператор this. С помощью него функцию eval() можно превратить вот в такой код:


После такого преобразования мы спокойно сможем использовать «a()» вместо «eval()».

Изменение на нечитаемые строки

  1. "o", "O", "0"
  2. "i", "I", "l", "1"
  3. "_" (и варианты "__" , "___" . )
  4. "$" (и варианты "$$" , "$$$" . )

Шифрование кода

Способов шифровки текста существует неограниченное количество, хотя все они основаны на использовании каких-либо текстовых/числовых функций. Часто работает конструкция: eval() + функция_расшифровки() + шифрованная_строка. Попробую без лишней воды показать один из таких способов.
Допустим, нам нужно зашифровать строку «alert(1);». Мне пришло в голову брать по два символа из нее, переводить их в числа (ASCII код), считывать их и рядом ставить первый символ в чистой (без перевода) форме. Только стоит учесть, что, разделяя код на такие двухбуквенные части, мы получим код примерно в 2-2,5 раза больше оригинала, а также нельзя забывать, что такие блоки лучше как-то разделять (как элемент массива или через разделитель). За разделитель возьмем знак «%», так как он делает шифрованную строку похожей на URL-строку. Напишем простой PHP-скрипт:


Вот что у нас получилось: « %a205%e215%t156%190%;59 ».
А теперь напишем дешифровщик этого кода на JavaScript:


Вызов кода в таком случае будет выглядеть так: «eval(d('%a205%e215%t156%190%;59'));».

Теперь остается только немного обфусцировать весь этот скрипт. Мы не будем использовать все описанные методы, а затронем лишь некоторые из них:

  1. z = '. ' Здесь переменной присваевается текст, который был получен переводом строки split!slice!length!fromCharCode!substr!charCodeAt в шестнадцатеричны вид (\x73\x70\x6C\x69\x74. ) без "\х";
  2. _='';for(. > Тут мы переводим обратно split!slice!length!fromCharCode!substr!charCodeAt в переменную "_";
  3. _=_. ('!'); Разделяем строку в тех местах, где есть символ "!";
  4. function ___(__) Описанная выше функция d() в обфусцированном виде;
  5. this['\x65\x76\x61\x6C'](. ); Декодирование строки и запуск кода.

Напоследок

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


Делаем скрипт читаемым

Как зашифровать JavaScript

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

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

Допустим, Вы написали такой код:

Чтобы его спрятать, воспользуемся сервисом: http://www.daftlogic.com/projects-online-javascript-obfuscator.htm. Вставляете туда код и жмёте "Obfuscate It!". Дальше в окне "Output" у Вас появляется уже зашифрованный код, который Вы вставляете вместо того, что был. В результате, получится следующее:

Результат выполнения этого кода будет аналогичен тому, который был написан выше. Но посмотрев на текущий код, едва ли кто-то сообразит, что это просто вывод строки "Hello, World!" (хотя догадаться можно по окончанию скрипта).

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


Если Вы не хотите пропустить новые материалы на сайте,
то Вы можете подписаться на обновления: Подписаться на обновления

Если у Вас остались какие-либо вопросы, либо у Вас есть желание высказаться по поводу этой статьи, то Вы можете оставить свой комментарий внизу страницы.

Порекомендуйте эту статью друзьям:

Если Вам понравился сайт, то разместите ссылку на него (у себя на сайте, на форуме, в контакте):

Она выглядит вот так:

Комментарии ( 15 ):

Да пускай берут мои скрипты, мне не жалко. Лучше мой сайт будет быстрым, чем с защищенными исходниками!

А если скрипты подключать с библиотек *.js? и с помощью *.htaccess запретить доступ к этой библиотеке ?? <Files *.js> Deny from all </Files>

Скрипт не будет работать вообще.

Не знаю, декодировать никак нельзя. Только лишь за огромные деньги и наймом людей, которые этим занимаются.

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

Извините, в Google на запрос: "как закодировать подпись на форуме?", выдало ссылку на эту тему.

Значит мой сайт, по мнению Google, лучше ответит на данный вопрос. Но это не означает, что он ответит хорошо. Другие сайты по его мнению, ответят ещё хуже.

Знаете, как в "Бриллиантовой руке", - "мне нужен такой же, но с перламутровыми пуговицами". "будем искать". :-) Удачи Вам в вашем нужном деле. Хотел бы и я уметь создавать сайты.

Добрый день. Скажите а как перевести алфавит(строку) в двоичное число для шифрования побитовым XOR? c числами у меня всё получается а со строкой выдаёт 0 а если поставить унарный плюс то NaN.


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

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

Проблемы и ограничения

Лимит в 1 Мб

Если вы попробуете поработать с демонстрационной версией, то заметите, что она не позволяет шифровать файлы размером более 1 МБ. Я установил такой лимит, потому что атрибут HTML5 download , который я использую для запроса на загрузку файла для шифрования, не слишком хорошо работает с большими объемами данных.

При загрузке больших файлов текущая вкладка в браузере Google Chrome просто зависает, при использовании Firefox вылетает весь процесс браузера.

Способом решить эту проблему могло бы стать использование File System API и запись в нем двоичных данных, но на данный момент это приложение поддерживается только в Google Chrome.

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

Насколько это безопасно?

Я использовал алгоритм AES из коллекции, которая, насколько мне известно, безопасна. Для большей безопасности используйте длинные пароли, которые трудно подобрать:

Насколько это безопасно?

JavaScript File Encryption App

Разметка приложения состоит из обычного документа HTML5 и нескольких блоков, которые разделяют приложение на несколько отдельных экранов. Вы увидите, как они взаимодействуют в разделах JavaScript и CSS данной статьи.

С помощью CSS это имя класса определяет скрываются или выводятся элементы с классами if-encrypt или if-decrypt . Этот простой способ разделения позволяет обеспечить более чистый код, в котором минимально присутствуют элементы интерфейсов:

HTML

Выбор файла для шифрования

Код JavaScript

Как я уже упоминал, мы собираемся использовать HTML5 FileReader API ( поддержка ) и библиотеку CryptoJS .

Объект FileReader позволяет нам читать содержимое локальных файлов с помощью JavaScript, но только тех файлов, которые были выбраны пользователем непосредственно через диалоговое окно, предлагающее выбрать файл.

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

Я получил содержимое файлов в виде строки uri-данных . Браузеры позволяют использовать эти URI, везде, где могут использоваться обычные URL-адреса.

Их преимущество заключается в том, что они позволяют хранить исходное содержимое непосредственно в URI, поэтому мы можем, например, записать содержимое файла в виде ссылки href , а также добавить к ней атрибут download , чтобы при нажатии она загружалась, как файл.

Я использую алгоритм AES для шифрования URI-данных с выбранным паролем, и предлагаю его для скачивания. Во время расшифровки происходит обратная процедура.

При этом никакие данные на сервер на самом деле не пересылаются. Если на то пошло, вам даже не нужен сервер, вы можете просто открыть HTML-файл непосредственно из папки на вашем компьютере, и использовать его как есть.

Код JavaScript

Ввод пароля

Здесь я опишу только наиболее интересные части CSS-кода, остальное вы можете увидеть в таблице стилей из zip -архива с исходными материалами.

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

Еще одним интересным фрагментом кода являются условные классы, которые значительно упрощают наш JavaScript:

Таким образом, классы шифрования и расшифрования тела приложения управляют видимостью элементов, которые имеют соответствующий класс if-* .

Мы закончили!

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

Читайте также: