PHP basit bir şifreleme

3 Cevap php

Ben uyarlanamıyor sanal evcil hayvan sağlamak için 'net üzerinden veriyorum bir ile kaynak sistem inşa ediyorum. Sistem çocuklar tarafından çoğunlukla ait olacak. Ben mutlak acemi programcılar için kullanılabilir olmasını istiyorsanız bu yana, benim sistemde birkaç karmaşıklığı kısıtlamalar vardır: Yaygın PHP ile gemi yok kütüphaneleri kullanamaz, ve bir veritabanı dokunma veya diğer kalıcı depolama yazamıyor .

Her evcil hayvan kabul edildiğinde, ziyaretçi rastgele bu hayvan biraz farklı varyasyonları bir dizi birini verilecektir alacak. Varyasyonlar başlangıçta aynı görünür, ancak farklı evcil hayvan haline zamanla büyür. Ziyaretçinin kendi hayvan görüntüye bağlanan HTML kısa bir kod verilecektir. Kalıcı depolama mevcut sunucu tarafı olmadığından, kullanıcının resim linki onlar kalkarken bitti hangi hayvan varyasyonu belirlemek için tüm bilgileri içermelidir.

Şu anda, URL sadece kullanıcı var varyasyonun hayvan ve kimlik numarası içerir. Bu sorun birbirleri ile kodlarını karşılaştırarak, kullanıcıların aralarında aynı varyasyon ile sona erdi kim anlamaya olmasıdır. Bazı farklılıklar diğerlerinden daha nadir olduğundan fark bile görsel olarak belirgin önce, kullanıcıların kolayca nadir varyasyonları nokta olabilir.

Ne istiyorum URL ayrıntılar için bir şifreleme sistemi. Her kullanıcı yüksek bir olasılık ile farklı bir URL alır böylece varyasyon kimliğini gizler şey. Ben düşük bit veya büyük bir rasgele sayı yüksek bit olarak varyasyon kimliğini (3 veya 4 bit) kullanarak düşündüm, ancak kullanıcıların bu desen nokta olacaktır. Benim sistem her kurulumu biraz farklı bir şifreleme kullanmak istiyorsunuz böylece İdeal şifreleme sistemi parametrize olacaktır.

PHP'nin mcrypt kütüphanesi muhtemelen yararlı bir şey olurdu, ama Shell arasında çok yaygın olduğu görünmüyor.

Burada kullanabileceğiniz basit, parametrized, kandırma / şifreleme var mı?

3 Cevap

Eğer nispeten düşük gelişmişlik düzeyini bekliyoruz, o zaman çok basit bir "xor" şifreleme ve "mağaza" URL parçası olarak anahtar yapabilirsiniz. Sonra sadece PHP'nin rand () veya / dev / random veya ne olursa olsun anahtarları oluşturmak için kullanabilirsiniz.

Düşük sofistike kullanıcıların kolayca yapmaları gereken tüm arkadaşlarıyla mukayese edilebilir bir değer elde etmek için, üst yarısı ile hayvan kimliği alt yarısını XOR olduğunu anlamaya olmaz. Ben neler olduğunu olduğunu tanımak mümkün olacağını çoğu insan bunu anlamaya zaman alacağını değil tahmin ediyorum, ve bu insanlar zaten hedef kitleniz dışında bulunmaktadır.

Düzenleme: belirgin değildi, ben (aynı birini vererek beri sorununuzu çözmek olmaz) Her hayvan için farklı bir anahtar vermek söylüyorum. Hayvan varyasyon (petvar) 16 bitlik bir sayıdır Yani, bir 16-bit rasgele sayı (RND) oluşturmak, o zaman bunu: petvar = (petvar^rnd)<<16 | rnd; ve sonra RND ayıklamak için bu işlemi ters ve olabilir sonra petvar ^ rnd, ve sonra sadece orijinal petvar almak için tekrar XOR.

Sen "bir kez doldurma" şifreleme arıyoruz. Bu bir anahtar alır ve şifreli dize oluşturmak için karakter modülü ek yapar.

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;
}

Böylece basit bir dize şifreleme bulunuyor. Ne yapacağını kullanıcının parametreleri dizi serialize ve bağlantı bir değişken olarak geçmektedir:

$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 sen tersini yapmanız gerekir:

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

Bam.

Neden sadece her kullanıcıya uzun, rasgele bir kimlik vermek ve sonra sunucu üzerinde kendi evcil hayvan hakkında bütün bilgileri saklamak değil? En iyi uygulama şifreli veya URL şey, saklamak için değil. Eğer gerektiğinde tüm bir oturum kimliktir.