Простая шифровка методами Javascript

16 февраля 2010 г.

Итак представим себе нелепейшую ситуацию. Имеется у вас хостинг. Скорее всего бесплатный. Ибо какой же уважающий себя бесплатный хостинг, даст юзеру 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<Stri.length;i++)
{

var c=Stri.charAt(i);
var com=c.charCodeAt(0)^Mask.charCodeAt(j);
c=String.fromCharCode(com);
//if(c=='\\') fri+='\\';
fri+= c;
if(j==Mask.length-1)j=0; else j++;
}

//Пишем в выходной файл
var fso, ts;
fso = new ActiveXObject("scripting.FileSystemObject");
ts = fso.OpenTextFile(filepath, 2, true);
ts.WriteLine(fri);
ts.close();


}

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

Замечу, что здесь мы используем средства 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<Stri.length-2;i++)
{
var c=Stri.charAt(i);
var com=c.charCodeAt(0)^Mask.charCodeAt(j);
c=String.fromCharCode(com);
fri+= c;
if(j==Mask.length-1)j=0; else j++;
}
fri+='\0';
document.all.te2.innerHTML="";
}

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

Теги: рубрика JavaScript
  • Похожие статьи
  • Предыдущие из рубрики