как зашифровать php код
Шифрование текста на php
Добрый день!
Сегодня я расскажу о моем механихме шифрования.
Не знаю — может он ненадежный, может его уже кто-то изобрел, как говорится, «я хз, мне норм».
Итак, приступим.
Сначала шифрование. Для начала берем строку, который нужно зашифровать, переводим его в base64 (так как base64 ключ состоит только из символов a-z, A-Z, 0-9).
Затем с каждого символа получаем md5-хэш, для удобства кладем в массив.
С каждого хэша берем символ №3,6,1,2 (можно другие, я решил что эти подойдут) и склеиваем их.
Чтобы расшифровать проходимся циклом по коду, заменяем хэш[3,6,1,2] на символ, которому он соответствует.
Ну, и потом декодируем из base64.
Код:
Код самой формы не буду показывать, там все просто.
Слово «Хабр», зашыфрованное ключом «12345» будет «739ef7fc5215e83e5215b8345a02e83e706a8fff5a025e2f5215618bfa54505b52155e2fec2755e2dc07a1106837c7fe29caa11052151c34739ef7fc5215e83e5215b834f9b77ca1706ac7fe65b765b7», а «habr» с тем же ключом будет «7375314fc971f7fca334f9b765b765b7».
Думаю не надо объяснять что base64 с кириллицы длиннее, чем с латиницы.
Ну вот и все.
Демка тут.
О песочнице
Это «Песочница» — раздел, в который попадают дебютные посты пользователей, желающих стать полноправными участниками сообщества.
Если у вас есть приглашение, отправьте его автору понравившейся публикации — тогда её смогут прочитать и обсудить все остальные пользователи Хабра.
Чтобы исключить предвзятость при оценке, все публикации анонимны, псевдонимы показываются случайным образом.
О модерации
Не надо пропускать:
Защита PHP-скриптов от анализа и модификации
Все программные продукты для защиты PHP-скриптов подразделяются на две категории: требующие установки на сервер дополнительных модулей и работающие с обычной конфигурацией web-серверов. Первые более надежны в плане безопасности, так как переводят PHP-скрипты из текстового вида в специальный двоичный-код, но требуют доступа к серверу с правами администратора. Вторые могут работать практически на всех хостингах с поддержкой PHP, в том числе и бесплатных, но не представляют большой сложности для взлома. В отдельную подгруппу можно выделить обфускаторы исходного кода, не использующие шифрование или сжатие.
Защиты на уровне сервера:
NuSphere NuCoder. Новая, активно развивающаяся коммерческая защита. На уровне собственных API предоставляет взаимодействие с защищаемыми скриптами, поддерживаются операционные системы Windows и Linux. Вследствие малой распространенности не устанавливается на обычных виртуальных хостингах, но вполне может быть установлена пользователями на выделенных серверах. Публичных декодеров нет.
SourceGuardian for PHP. Коммерческая защита, практически не встречается, на вирутальных хостингах не устанавливается. Позволяет устаналивать триальный срок работы скриптов с проверкой даты по внешним серверам точного времени, делать привязку защищаемых скриптов к серверам, ip-адресу, MAC-адресу сетевой карты, причем эти данные используются для расшифровки. Поддерживаются все операционные системы. Публичных декодеров нет.
phpSHIELD. Прототип SourceGuardian for PHP. После слияния двух разработчиков перестал развиваться как самостоятельный продукт. Основной функционал тот же самый, публичных декодеров нет.
ionCube PHP Encoder. Второй по популярности коммерческий продукт для защиты скриптов. После появления публичных декодеров для Zend стал все чаще использоваться и устанавливаться на виртуальных хостингах. Позволяет шифровать не только скрипты, но и шаблоны, xml-документы, изображения, бинарные файлы. Привязывает защищенные файлы к серверам, есть мощный обфускатор, поддерживаются все операционные системы. Публичных декодеров нет, но в некоторых случаях снимается deZender’ом.
PHTML Encoder. Малораспространенная коммерческая система защиты, предоставляет обычный функционал для продуктов такого типа, работает под всеми операционными системами. За отдельную плату можно приобрести исходные коды защиты и модифицировать их под свои нужды. Публичных декодеров нет.
DWebEncoder. Экзотическая защита под Windows, предназначенная для создания скриптовых презентаций и каталогов на компакт-дисках. В установленном виде представляет собой что-то типа самостоятельного web-сервера, на котором исполняются закодированные php-скрипты. Публичных декодеров нет.
PHP Compact. Защита скорее теоретическая, чем практическая. Разрабатывалась на одном из отечественных форумов, но похоже дальше авторских релизов дело не продвинулось. Декодеров нет, впрочем как и защищенных скриптов.
PHPCoder / eAccelerator. Дополнение с открытым кодом к старинным php-акселераторам Turck MMCache и eAccelerator. Переводит скрипты в байт-код с целью повышения скорости их выполнения. Есть версии модулей под Windows и Linux. Публичных декодеров нет, но возможно открытый код проекта как-то поможет в изучении.
Защиты на уровне исходного кода:
CNCrypto. В свободном доступе нет даже демо-версии, анализ проводился по защищенным скриптам. Навесной модуль сложности в распаковке не представляет, защита держится только на хорошей обфускации исходного кода.
PHPCipher. Защита представляет собой он-лайн сервис. На сайт загружается архив с вашими скриптами и обратно скачивается уже защищенный. Платная лицензия позволяет подписывать защищенные скрипты своими данными и использовать для коммерческих целей. Бесплатная лицензия допускает использование только для личных нужд. Сама защита представляет собой защищенный Zend’ом php-модуль, который подключается к защищенным скриптам. После deZend’а модуля защиты и получения из него всех необходимых констант снимается полностью до исходного кода. Функции обфускатора нет.
ByteRun Protector for PHP. Коммерческий продукт, в зависимости от типа лицензии позволяет защищать скрипты как на уровне сервера, так и на уровне исходного кода. Серверная защита со стандартными возможностями, ничего особенного нет. Защита на уровне скриптов снимается очень легко автоматически и вручную. Публичного декодера на серверную версию нет.
SourceCop PHP Protector. Очень популярная у отечественных разработчиков защита. Представляет собой сильно замусоренный пустым кодом модуль защиты, который подключается через include к защищенным скриптам. Алгоритм декодирования очень простой, не вызывает никаких сложностей в ручном и автоматическом снятии. Во всех случаях снимается полностью до исходного кода, функции обфускатора нет. Есть небольшие особенности для частных случаев декодирования, но здесь они описаны не будут.
CodeLock. Еще одна популярная защита, отличный пример безграмотного программирования. Представляет собой приложение на php, позволяет кодировать как сами скрипты, так и результат их работы в браузере средствами javascript. Скрипты можно защищать паролем, но из-за бездарной реализации пароль легко узнать даже не снимая навесную защиту. Модуль защиты представляет собой замусоренный пустым кодом php-скрипт, который подключается к защищаемым скриптам. Алгоритм защиты очень простой, снимается полностью до исходного кода. Функции обфускации нет.
Free PHP Encoder. Бесплатный он-лайновый сервис для кодирования php-скриптов. Модуль защиты представляет собой подключаемый php-скрипт, накрытый Zend’ом, который надо скачать с сайта. После снятия Zend’а и разбора алгоритма защита легко снимается полностью до исходного кода. Алгоритм защиты неизменный, функции обфускатора нет.
gencoder. Скрипт на php, кодирование примитивное, стандартный base64. Большего внимания не заслуживает и практического интереса не представляет.
FREE Encrypted PHP. Бесплатный он-лайновый шифровщик файлов, выполняющий привязку к серверу и ограничение по времени работы скрипта. К зашифрованным скриптам подключается модуль расшифровки, накрытый ionCube. После открытия алгоритма расшифровки легко снимается.
Free Online PHP Obfuscator. Бесплатный он-лайновый шифровщик файлов, несмотря на слово «obfuscator» в названии, дополнительно сжимает и шифрует скрипты. Внешняя шифровка сложности в снятии не представляет, основная защита держится на обфускации текстовых строк и имен переменных.
Обфускаторы:
Особого интереса в плане изучения не представляют, все работают по одинаковому принципу: замена названий переменных на набор случайных символов, удаление комментариев, переносов строк и пробелов, использованных для форматирования кода. К ним относятся GridinSoft PHP Processor, Semantic Designs Obfuscator, PHP Defender, Raizlabs PHP Obfuscator, Obfusc, POBS, PHP UnReader, Code Eclipse и другие. По деобфускации различных скриптов есть полезная статья статья.
Для определения чем защищены скрипты можете воспользоваться программой PCL’s PHPiD. По всем вопросам «а где взять декодеры?» и «а как сломать?» обращайтесь к поисковым системам.
Защита PHP скриптов от копирования — это возможно?
Бывает так, что вам неохота предоставлять исходные коды проектов, которые вы разрабатывали. Для этого можно использовать программы-обфускаторы, о которых недавно шла речь.
А бывает, что вам не так хочется закрыть исходный код, как защитить скрипт от копирования. На мой взгляд, сокрытие исходного кода, в большинстве случаев, не имеет смысла без защиты от копирования. Некоторые обфускаторы, шифрующие код (а не просто коверкающие), имеют возможность лочить скрипт под определенный домен или айпишник. Но, во-первых, мы же не хотим для каждого домена перешифровывать все исходники? Во-вторых, мне удалось разлочить эту защиту одной строкой в начале скрипта:
Я долго искал в интернете решение для защиты от копирования. На форумах этот вопрос часто обсуждался, в основном, задавали его новички, а опытные (видимо) программисты отвечали «— Ты дурак, кому нужен твой код. Учи матчасть, да и вообще php-скрипты ничего не достойны!». Что ж, подумал я. Наверное, действительно нельзя. Но подождите, тот же Битрикс (фу) выдает лицензии на отдельные сайты, при этом вы получаете открытый исходный код после покупки лицензии. Что же мешает скопировать его на несколько своих сайтов? Я не знаю, а если вы знаете — скажите мне пожалуйста.
Решение
1. Выдача лицензии и проверка действительности лицензии скриптом
Итак, скрипт проверил правильность лицензии. То есть, подходит ли указанный ключ к указанному домену. Идем дальше.
2. Проверка домена
А точнее:
1) сохраняем случайное число на сервре (например, во временном файле)2) обращаемся по адресу наш_домен.ру/наш_скрипт.php?action=скажи_число3) проверяем, какое число нам отдают по этому адресу. Если оно соответсвует тому, что мы сохранили, значит, по адресу находимся мы :)0) нулевым пунктом надо добавить отдачу сохраненного числа, если нас вызвали с параметром action=скажи_число
Я немного упростил алгоритм, на самом деле для каждого обращения к скрипту нужно отдельно учитывать эти случайные числа.
Теперь скрипт знает, что лицензия действительна, и что он лежит на соответствующем домене. Основная задача решена!
Вы скажите — wtf, скрипт при каждом обращении будет дергать сам себя? Действительно, жестоко как-то. Поэтому:
3. Временная лицензия
При первом обращении, если проверка прошла успешно, скрипт сохраняет во временном файле временную лицензию.
Временная лицензия представляет собой что-то ноподобие md5(сегодняшняя_дата, домен, секретное слово).
Теперь при каждом запросе мы проверяем только временную лицензию, которая действительна в течение дня. Как только со временной лицензией что-то неладное (поменяли, удалили, прошли сутки) — скрипт опять проверит всё серьезно и сохранит новую временную лицензию.
4. Выполнение скрипта на локальном компьютере без лицензии
Было бы идеально, если бы скрипт не требовал лицензии при запуске на локальном компьютере. Зачем, спрашивается, человеку требовать с меня лицензию, если он просто хочет протестировать скрипт на своем компьютере? Он должен скачать его, и пользоваться. А вот когда он поставит скрипт на сервер, тогда и прийдет ко мне.
Я не знаю как решить эту задачу. У меня пока есть 3 варианта решения, но они мне не нравятся:
1) Если скрипт лежит на домене без точек (типа myscript) — считать, что это виртуальный домен, значит, скорее всего, это локальное тестирование. Недостаток этого метода — умельцы создадут виртуальный домен на своем сервере, а настоящий домен сделают синонимом. Так же, непонятно что делать с доменом localhost.
3) Смешно, но можно проверить операционную систему сервера. И разрешить выполнение под Windows. Только не бейте меня, это всего лишь вариант.
Выкладываю пример скрипта для тестирования.
Я с благодарностью жду конструктивных комментариев. Возможно, вы найдете ошибку в этой защите, или подадите сежую идею.
Шифрование отдельной части PHP-скрипта
Многие из тех, кто программируют на PHP, сталкивались с необходимостью шифрования своих скриптов в байткод для передачи на сторону. Слава богу, в наши дни существует огромный ассортимент PHP Encoder’ов, — как говорится, на любой вкус и цвет!
Мы же в своей работе столкнулись с нетривиальной задачей. Требовалось скрыть лишь некоторую часть кода, — функцию, содержимое которой не должен увидеть никто, кроме нас.
При этом нельзя зашифровать весь файл, так как все, кроме этой функции, должно быть на виду, чтобы технические специалисты принимающей стороны убедились в отсутствии «криминала» в скрипте. Вынести функцию в отдельный файл тоже нельзя, ибо мы должны быть убеждены, что md5 всего кода остался неизменным, а это значит, что необходима уверенность в неизменности первоначального вида как зашифрованной, так и видимой части скрипта.
Что делать? Первое, что пришло на ум — так называемые обфускаторы, то есть «запутывальщики» кода. При этом такой код может быть загружен без необходимости дополнительных модулей loader’ов для PHP, что является плюсом. Минусом же является то, что даже самый лютый обфускатор, который удалось найти, шаг за шагом ломался в течение 15-20 минут без излишней спешки.
На полке тем временем пылился старый добрый Zend Encoder 3.6. Понятно, что encoder’ом часть скрипта не зашифруешь, но задача требовала решения. Если посмотреть в получившийся зашифрованный файл, то можно обнаружить некоторую часть PHP-кода в начале каждого файла, а именно:
Далее мы шифруем этот файл и вместо Encoder’овской заглушки ставим нужный нам скрипт.
Осталось лишь подсчитать количество байт в нашем «видимом» скрипте, дабы правильно установить значение для Zend Optimizer’а во второй строчке файла (после «@Zend»). Было лень высчитывать его вручную, поэтому написали еще один скрипт с двумя циклами: в первом цикле создавалось некоторое количество копий файла с разными «около-правдивыми» значениями байт, а во втором все эти скрипты дергались wget’ом. Скрипт с правильным значением вернет 200-й заголовок вместо 500-го.
Все готово. Итоговый файл содержит «видимую» часть скрипта и байткод. Если сервер сконфигурирован с модулем Zend Optimizer’а, то при вызове скрипта сначала исполнится его зашифрованная часть, а после — та, которую мы не скрываем. В некоторых коммерческих задачах это действительно очень необходимо.
Шифрование данных на PHP
Дата публикации: 2013-11-18
От автора: в данном уроке мы с Вами рассмотрим шифрование данных стандартными средствами языка PHP. Так как при создании различных скриптов очень часто возникает задача шифрования данных. К примеру, важную информацию, которую необходимо сохранить в куках, можно зашифровать для повышения безопасности сайта.
Введение
В данном уроке мы с Вами не будем рассматривать все теоретические моменты процесса шифрования данных, так как для этого понадобиться несколько уроков. Мы изучим только основы, но их полнее будет достаточно, что бы Вы смогли зашифровать данные и выполнить их расшифровку.
Шифрование бывает двух видов: однонаправленное – когда данные можно только зашифровать, а расшифровать нельзя (к примеру, шифрование md5) и двунаправленное – когда есть возможность, как зашифровать, так и расшифровать данные. В данном уроке мы будем использовать двунаправленное шифрование. Для работы с шифрованием в языке PHP разработано расширение под названием mcrypt, которое позволяет шифровать данные используя различные алгоритмы шифрования (шифры).
Бесплатный курс по PHP программированию
Освойте курс и узнайте, как создать динамичный сайт на PHP и MySQL с полного нуля, используя модель MVC
В курсе 39 уроков | 15 часов видео | исходники для каждого урока
Так как шифрование данных – это целая наука и при создании собственного алгоритма, Вы можете не учесть множество различных моментов. Что приведет к уязвимости зашифрованных данных и возможно к взлому их злоумышленниками. Лучше всего использовать уже готовые алгоритмы, которые очень надежны и, так сказать, проверены временем. Алгоритм шифрования – это собственно то, каким образом будут зашифрованы данные.
Каждый алгоритм поддерживает различные режимы шифрования. Режим шифрование – это метод применения блочного шифра, который позволяет преобразовать последовательность блоков исходного текста, который шифруется, в последовательность блоков зашифрованных данных. При этом при шифровании могут использоваться данные других блоков. Мы с Вами будем использовать один из лучших режимов шифрования — MCRYPT_MODE_CFB. Данный режим, еще называют режимом обратной связи по шифрованному тексту, т.е — это такой вариант использования блочного шифра, при котором для зашифровки следующего блока текста используется результат зашифровки предыдущего блока.
Полную документацию, по расширению mcrypt можно посмотреть на официальном сайте интерпретатора языка PHP, по адресу: //us3.php.net/manual/ru/book.mcrypt.php
Полный перечень всех алгоритмов шифрования можно посмотреть по следующей ссылке: //us3.php.net/manual/ru/mcrypt.ciphers.php
Ну и конечно все режимы шифрования доступны здесь: //us3.php.net/manual/ru/mcrypt.constants.php
Теперь давайте приступим к шифрованию данных.
Шифрование данных
Для начала давайте создадим небольшую форму для ввода текста, подлежащего шифрованию: