2013-04-08 53 views
14

Kodlamak için biri kodlanacak iki işlev/yönteme ihtiyacım var. Bu, parolaları saklamak için değil. Her kullanıcının verileri kodlamak için belirli bir anahtarı/tuzu olacaktır. Kullanıma özel anahtar kullanarak iki yollu kodlama/kod çözme yöntemleri nasıl oluşturulur - PHP?

Bu

Ben çalışmak istiyorum nasıl:

function encode($str, $key) { 
    // something fancy 
} 

function decode($str, $key) { 
    // something fancy 
} 

$key = $logged_in_user->get_key(); 
$plain = 'abc abc 123 123'; 
$encoded_data = encode($plain, $key); 
// some_fancy_encrypted_data_that_is_really_cooooool 
$decoded_data = decode($encoded_data, $key); 
// abc abc 123 123 

Başka bir şey her zaman aynı şeyi ben aynı kullanıcı anahtarı ile encode işlevini kullanın her zaman dönmek gerekiyor Bu fonksiyonu kullanmak olduğunu .

Bunu nasıl yapardım?

+4

Yani mesela mcrypt'e (http://www.php.net/manual/en/mcrypt.examples.php) baktınız mı? Ve 'hash' etiketini bırakın, çünkü siz __don't___ bir karma –

+0

istiyorum. [Küçük bir sınıfım var] (http://stackoverflow.com/questions/15034368/cannot-decrypt-openssl-encrypt-output-on -command-line) ihtiyacınız olanı yapabilir, ancak asıl soru, her bir kullanıcının verilerini bağımsız olarak tek tek şifrelemeye ihtiyaç duyduğunuzu hissetmenizdir. Saldırıya uğramış verilerinizi görebildikten sonra, kaynak kodunuzu, dahili şifrelemenin en iyi kullanımlarını geçersiz kılarak, olabildiğince iyi bir şekilde görebileceğini düşünürüz. – Sammitch

+0

@Sammitch Bazı durumlarda, verileri şifrelemek/şifresini çözmek için kullanılan anahtar herhangi bir yerde bulunamazsa (ve yalnızca kullanıcıya aitse) yararlıdır. LastPass'in de bunu yaptığına eminim. – h2ooooooo

cevap

46
$myVarIWantToEncodeAndDecode 

tanımlama anahtarı (tuz, suyu vb ..): $key = "#&$sdfdfs789fs7d";

kodlamak için:

$encoded = base64_encode(mcrypt_encrypt(MCRYPT_RIJNDAEL_256, md5($key), $myVarIWantToEncodeAndDecode, MCRYPT_MODE_CBC, md5(md5($key)))); 

şifresini çözmek için:

$decoded = rtrim(mcrypt_decrypt(MCRYPT_RIJNDAEL_256, md5($key), base64_decode($encoded), MCRYPT_MODE_CBC, md5(md5($key))), "\0"); 

Not: mcrypt_decrypt DEPRECATED edilmiştir PHP 7.1.0'dan itibaren. Bu işleve güvenmek son derece cesaret kırılmıştır.

+0

hmm .. Bu işe yarıyor gibi görünüyor, ancak dizenin kodunu çözmekten geri döndüğüm veriler “A” · fµŒ ”÷ Óÿ ‰ Zvÿ“ õE ¥ ‰ ¬DõØ & Hå§ ”. Sorun nedir? –

+0

Yani kod çözüyor ve doğru kodlanıyor? Neyi kodluyorsun? düz metin kodlanmış veriler şöyle görünmelidir: 'VXHE0iM0bMXQecCAKYAzYZjy4gbctqLGQHYvW2cFhaE =' – rinchik

+0

http://phpfiddle.org/lite/code/zj5-ic6 – rinchik