2013-04-08 15 views
14

Ho bisogno di due funzioni/metodi, uno per la codifica, uno per la decodifica. Questo non è per memorizzare le password. Ogni utente avrà una chiave/sale specifica per codificare i dati.Come creare metodi di codifica/decodifica bidirezionali usando la chiave specifica per l'uso - PHP?

Questo è quanto vorrei farlo funzionare:

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 

Un'altra cosa è che ogni volta che uso questa funzione deve restituire la stessa cosa ogni volta che uso la funzione encode con la stessa chiave dell'utente .

Come faccio?

+4

Quindi hai guardato a mcrypt (http://www.php.net/manual/en/mcrypt.examples.php)? E rilascia il tag 'hash', perché dici che __non vuoi un hash –

+0

Ho una [piccola classe] (http://stackoverflow.com/questions/15034368/cannot-decrypt-openssl-encrypt-output-on -command-line) che può fare ciò di cui hai bisogno, ma la vera domanda è perché senti la necessità di criptare individualmente i dati di ciascun utente in modo indipendente. In genere si presume che una volta che un utente attaccato può vedere i dati memorizzati, può anche vedere il codice sorgente che invalida la maggior parte degli usi della crittografia interna, per quanto intenzionati a farlo. – Sammitch

+0

@Sammitch In alcuni casi è utile se la chiave utilizzata per crittografare/decrittografare i dati non può essere trovata da nessuna parte (e appartiene solo all'utente). Sono abbastanza sicuro che LastPass fa anche questo. – h2ooooooo

risposta

46
$myVarIWantToEncodeAndDecode 

Definire chiave (sale, brodo, ecc ..): $key = "#&$sdfdfs789fs7d";

per codificare:

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

per decodificare:

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

Nota: mcrypt_decrypt è stato deprecato da PHP 7.1.0. Affidarsi a questa funzione è altamente scoraggiato.

+0

hmm .. Questo sembra funzionare, ma i dati che sto recuperando dalla decodifica della stringa sono "A" · fμŒ "÷ Óÿ ‰ Zvÿ" õ E ¥ ‰ ¬ DõØ & Hå§'. Cosa c'è che non va? –

+0

Quindi decodifica e codifica correttamente? Cosa stai codificando? testo normale? dati codificati dovrebbe essere simile a questo: '' VXHE0iM0bMXQecCAKYAzYZjy4gbctqLGQHYvW2cFhaE = – rinchik

+0

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