Простое шифрование в PHP - PullRequest
8 голосов
/ 29 ноября 2008

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

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

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

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

В библиотеке PHP mcrypt, возможно, есть что-то полезное, но, похоже, она не очень распространена среди хостеров.

Можно ли здесь использовать простое параметризованное запутывание / шифрование?

Ответы [ 3 ]

16 голосов
/ 29 ноября 2008

Вы ищете шифрование с "однократным заполнением". Для создания зашифрованной строки требуется ключ и дополнение модуля к символам.

function ecrypt($str){
  $key = "abc123 as long as you want bla bla bla";
  for($i=0; $i<strlen($str); $i++) {
     $char = substr($str, $i, 1);
     $keychar = substr($key, ($i % strlen($key))-1, 1);
     $char = chr(ord($char)+ord($keychar));
     $result.=$char;
  }
  return urlencode(base64_encode($result));
}


function decrypt($str){
  $str = base64_decode(urldecode($str));
  $result = '';
  $key = "must be same key as in encrypt";
  for($i=0; $i<strlen($str); $i++) {
    $char = substr($str, $i, 1);
    $keychar = substr($key, ($i % strlen($key))-1, 1);
    $char = chr(ord($char)-ord($keychar));
    $result.=$char;
  }
return $result;
}

Так что это простое шифрование строк. Я хотел бы сериализовать массив параметров пользователя и передать его в виде переменной в ссылке:

$arr = array(
  'pet_name'=>"fido",
  'favorite_food'=>"cat poop",
  'unique_id'=>3848908043
);
$param_string = encrypt(serialize($arr));

$link = "/load_pet.php?params=$param_string";

В load_pet.php вы должны сделать обратное:

$param_string = $_GET["params"];
$params = unserialize(decrypt($param_string));

Bam. * * 1 010

10 голосов
/ 29 ноября 2008

Если вы ожидаете относительно низкого уровня сложности, то вы можете сделать очень простое шифрование «xor» и «сохранить» ключ как часть URL. Затем вы можете просто использовать php rand () или / dev / random или что-то еще для генерации ключей.

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

Редактировать: Если это было неочевидно, я говорю, что вы даете разные ключи каждому питомцу (поскольку предоставление одного и того же не решило бы вашу проблему). Таким образом, если вариант с домашним животным (petvar) представляет собой 16-битное число, вы генерируете 16-битное случайное число (rnd), а затем делаете это: petvar = (petvar^rnd)<<16 | rnd;, а затем вы можете отменить эту операцию, чтобы извлечь rnd, а затем petvar ^ rnd , а затем просто добавьте его еще раз, чтобы получить оригинальный петвар.

2 голосов
/ 29 ноября 2008

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...