sonyps4.ru

Шифрование javascript кода. Защита и усложнение javascript кода

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

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

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

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

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

1. специальные программы для защиты javascript кода (HTMLCrypt , Java Script Mutator , Jasob , HTML Guardian и другие). Такие программы могут шифровать не только javascript код, но и код html, запихивая его в переменные js. К плюсам этого способа защиты можно отнести различные степени шифрования, мощные алгоритмы шифровки, удобство и быстрота. К минусам: не всегда получается кроссбраузерность, программы распространяются не бесплатно.
2. специальные сайты сервисы, на которых Вы можете бесплатно зашифровать свой javascript файл с помощью javascript компрессоров. Наиболее популярными являются:
- http://dean.edwards.name/packer/
- http://javascriptobfuscator.com
- http://sure-in.com/htmlcoder.htm
Плюсами такого способа есть бесплатная возможность и ничем не хуже платных программ степень защиты javascript файлов. Минус: удаленность сервиса, постоянное посещение сайта и новая перекодировка скриптов. Еще, также, в минус можно отнести неизвестный алгоритм использования удаленным javascript компрессора. Кто знает, чем напичкали Ваш файл и не можно ли его спокойно расшифровать другим сервисом с этого сайта.
3. создать самому или скачать php библиотеку (класс), которая будет находится на Вашем сервере и автоматически будет шифровать необходимые javascript файлы. Плюс: бесплатный и понятный js компрессор, который Вы можете использовать по своему усмотрению. Таких библиотек в интернете немного, но Вы можете бесплатно скачать здесь:
- http://joliclic.free.fr/php/javascript-packer/en/
- http://phpclasses.segmenta.ru/browse/package/4818.html

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

395

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

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

Итак составим план действий. Есть у нас данные. Там будут вероятно HTML теги, авось и текст какой заваляется. Собственно способ исключительно для текстовых данных, вы уж не обессудьте. Допустим лежит это у нас где-нибудь в файле «tex.txt». (Замечу, что в моей реализации, к сожалению, поддерживаются исключительно некиррилические символы в данных.)

Что значит мы должны сделать.

1. Взять эти самые данные и каким-нибудь алгоритмом их шифрануть. Я приведу пример для самого простого способа, а именно - побитового xor’а с некоторой маской, которую иногда ещё называют паролем. Скрипт прилагается. Реализовывал я это через JavaScript, хотя знаком и с более удобными вещами(замечу, что c в подобных делах значительно удобнее, однако существует нюанс из-за которого я не стал реализовывать само шифрование через c).

Function shif(filepath,filepath2,mask) { //Создаем и инициализируем некоторые переменные var fri=new String("");//alert("d"); var Stri=new String(""); var Mask=new String(mask); var i=0;var j=0; //Открываем и читаем из файла не зашиврованные данные var fsp = new ActiveXObject("scripting.FileSystemObject"); var tf = fsp.OpenTextFile(filepath2,1, true); Stri=tf.ReadAll(); tf.close(); //Собственно шифруем строку for(i=0;i

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

Замечу, что здесь мы используем средства ActiveX. Но это не слишком страшно, так как конкретно этот скрипт мы будем запускать исключительно на своей собственной машинке и заботиться по поводу всяких там «Эта страница может быть небезопасной..» нам совершенно не надо. Кстати, для непосвященных: ActiveX работает только из под IE. Ни один другой браузер, насколько я знаю этот объект не поддерживает.

Также прокомментирую функцию шифрования строки. Здесь мы выбираем символ из исходной строки, получаем его код, «ксорим» с байтом маски, возвращаем в символьную переменную и толкаем это благолепие непосредственно в строку. Собственно в этом самом месте и подозрительно было бы юзать c, ибо числовое представление символа в различных кодировках отличается, и используй мы код, полученный от некого компилятора, для получения шифровки, совсем не гарантия, что его кодировка совпадет с кодировкой в js, который как расшифровщик по любому будет работать на клиентских компах. А иначе мы не смогли бы использовать одно из самых приятных свойств xor’а, а именно то, что поксорив байт дважды с одним и тем же байтом, мы получим исходный байт. То есть для расшифровки требуется наложить на шифрованные данные маску, использованную при шифровании, а ведь её то как раз знаете только вы! И те, кому вы любезнейше передали сию информацию.

2. Теперь, когда у вас есть шифровка, осталось только встроить в страницу, отправляемую читателям вашего сайта расшифровщик и собственно сами данные.

Итак расшифровщик:

Function uncr(tex,mask) { var fri=new String(""); var Stri=new String(""); Stri=tex; var i=0;var j=0; var Mask=new String(mask); for(i=0;i

Тут то мы и видим преимущества xor’a. Цикл-расшифровщик идентичен шифровщику, за исключением того факта, что мы изменили длину итоговой строки, по сравнению с полученной по параметру. Здесь это связано с тем, что строка, которая подается на вход данной функции в моем случае была считана из того самого файла, в который её положила функция шифрования. Однако надо заметить, что это не совсем правильно, так как предпочтительно, чтобы на стороне клиента не использовались средства ActiveX, так как это не очень хорошо повлияет на отношение пользователя к нам. Тут можно поступить двояко. Самый вроде как напрашивающийся в голову вариант - тупо скопировать из файлика, созданного шифровальщиком всю кодированную строку и вбить в нашу HTML страницу с расшифровщиком. Но это практически невозможно осуществить просто руками. Собственно почему. А потому что после шифрования в наш файлик идет такая невнятная чушь из Нуллов и прочей гадости, что ни один текстовый редактор эту муть в HTML правильно не посадит. Как вариант - использовать собственно другую программу, которая впишет в HTML эти самые данные и кроме того все спец символы позаменяет. Честно скажу, что я такой пока не написал. А на домашней машине таки загружал строку из файлика. Итого я вижу только два выхода из ситуации - юзать ActiveX, предварительно предупредив пользователей об этом, или писать эту самую программу. Кстати, за первый вариант также говорит сам характер задания. Ведь мы пишем защищенную область, которая в теории открыта ограниченному кругу людей, и если они согласны писать куда-то там свой пароль, то и на «разрешить заблокированное содержимое» пойдут. Я уверен также, что есть множество других вариантов решения этой проблемы, помимо указанных.

Зачем нужно сжимать и кодировать код? Сжимать следует для снижения веса файла или сокращения занимаемого места. Что касается кодировки, то это нужно для тех, кто хочет воспользоваться Вашим готовым кодом без согласия или как минимум слова спасибо) Шифровка делает его нечитабельным.
Таким образом, кстати, можно закодировать не только код Java Script, но ещё и CSS. Перейдём к сервисам.

Список онлайн сервисов для сжатия и кодирования JS

1. JS Crunch
http://www.cfoster.net/jscrunch/
Автор: Charles Foster
Оптимальное шифрование и сжатие. Поддерживает UTF-8. Из минусов: не выводит никакой информации о проделанной работе - коэффицент сжатия, исходные, конечные размеры. Не всегда выдает рабочий зашифрованный код, поэтому проверяйте.

2. JavaScript Compressor
http://javascriptcompressor.com/
Автор: Dean Edwards
Онлайн компрессор. Предоставляет возможность закодировать код несколькими способами.

3. CSS & JavaScript Compressor
http://www.creativyst.com/Prod/3/
Онлайн компрессор. Довольно дубовый, без каких либо наворотов, вычищает лишние пробелы, табуляцию и пустые переводы строк.

Да, есть современные формы сжатия и считывания: прочитайте про gzip. Однако, не следует забывать о частных небольших примерах, где сервисы могут пригодиться. И как можно чаще занимайтесь чисткой и оптимизацией кода. Особенно при высоких нагрузках на сервис!)

12 ответов

Код Javascript выполняется в браузере, то есть на стороне клиента, что означает, что он должен быть не зашифрован на стороне клиента.

"Лучшее", что вы можете сделать, это, вероятно, минимизировать его, что затруднит его понимание - и немного obfuscation может сделать тоже - даже если кто-то действительно мотивирован, все равно сможет его прочитать.

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

Если то, что вы действительно задаете, - это то, как обфускать код, чтобы никто не мог его перепроектировать, ответ: вы не можете , а не в Javascript или любом другом язык. Лучшее, что вы можете сделать, это усложнить работу инженеров-реверсоров, затрудняя их чтение; для этого существует любое количество инструментов:

Я думаю, вы вводите в заблуждение шифрование с скомпилированным двоичным .

Даже коммерческое программное обеспечение с закрытым исходным кодом, такое как Microsoft Office или Adobe Photoshop, зашифровано для распространения. Но они скомпилированы в собственный машинный код, что затрудняет их перепроектирование.

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

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

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

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

То, что вы хотите, теоретически и практически невозможно. Люди скажут вам, что это невозможно, и вы можете подумать: "Ну, потому что никто не пробовал достаточно сильно". Нет. Точно так же невозможно вычислять n-е простое число в линейном или постоянном времени. Это невозможно так же, как решить проблему остановки. "Что вы имеете в виду, 2 + 2 не равно пяти? Вы не слишком стараетесь!"

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

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

Если ваш бизнес действительно зависит от сохранения секретности javascript, вы в основном допустили ошибку в своем бизнес-плане на этапе 1.

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

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

Microsoft использовала Script Encoder для кодирования вашего JavaScript (и ASP и VBScript и т.д.), но закодированный script работал только в Internet Explorer, поэтому он был большим no-no (ссылка)

В настоящее время возможна только обфускация. Но вы можете сломать любую обфускацию с помощью инструментов, таких как Online JavaScript Beautifier , чтобы вы не повезло. Вы можете свести к минимуму, и вы можете запутаться, но вы действительно не можете скрыть то, что вы делаете.

Лучший минимизатор/обфускатор, вероятно, Google Closure Compiler - он очень продвинутый и может превратить ваш код во что-то очень малопонятное.

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

Base64

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

Пример использования pidCrypt для работы с Base64 (демо)
var myString = "This is some text"; //encoding: var b64encoded = pidCryptUtil.encodeBase64(myString); //decoding: var b64decoded = pidCryptUtil.decodeBase64(b64encoded);

AES

Advanced Encryption Standard (AES)

Advanced Encryption Standard (AES) - симметричный алгоритм блочного шифрования (размер блока 128 бит, ключ 128/192/256 бит), принятый в качестве стандарта шифрования правительством США по результатам конкурса AES. Этот алгоритм хорошо проанализирован и сейчас широко используется, как это было с его предшественником DES. Национальный институт стандартов и технологий США (англ. National Institute of Standards and Technology, NIST) опубликовал спецификацию AES 26 ноября 2001 года после пятилетнего периода, в ходе которого были созданы и оценены 15 кандидатур. 26 мая 2002 года AES был объявлен стандартом шифрования. По состоянию на 2009 год AES является одним из самых распространённых алгоритмов симметричного шифрования.

Пример симметричного шифрования AES (демо)
var aes = new pidCrypt.AES.CBC(); // Шифрует текст var crypted = aes.encryptText("Шифруем текст", "password", {nBits: 256}); // Расшифрует текст var decrypted = aes.decryptText(pidCryptUtil.stripLineFeeds(crypted),"password",{nBits:256});

RSA

RSA - криптографический алгоритм с открытым ключом

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

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

Примечание

Информацию про шифрование на JavaScript я искал довольно давно когда думал про создание чата с оконечным шифрованием или веб-сервиса заметок с шифрованием текста заметок на стороне клиента. Собственно плагин чата для личной переписки пользователей я сделал и теперь думаю нужна ли в нём функция шифрования сообщений.

Загрузка...