2013-04-08 1 views
14

Ich brauche zwei Funktionen/Methoden, eine zum Verschlüsseln, eine zum Decodieren. Dies ist nicht zum Speichern von Passwörtern. Jeder Benutzer hat einen bestimmten Schlüssel/Salz, um die Daten zu verschlüsseln.Wie man Zweiwege-Enkodierungs-/Dekodierungsmethoden unter Verwendung eines anwendungsspezifischen Schlüssels - PHP - erzeugt?

Dies ist, wie ich es arbeiten möchte:

ist
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 

Eine andere Sache, dass jedes Mal, wenn ich verwenden diese Funktion braucht es die gleiche Sache jedes Mal, ich benutze die encode Funktion mit dem gleichen Benutzerschlüssel zurückzukehren .

Wie würde ich das tun ??

+4

Also hast du überhaupt über mcrypt (http://www.php.net/manual/en/mcrypt.examples.php) nachgedacht? Und lassen Sie das 'hash'-Tag fallen, weil Sie sagen, dass Sie __don't__ wollen einen Hash –

+0

Ich habe eine [kleine Klasse] (http://stackoverflow.com/questions/15034368/cannot-decrypt-openssl-encrypt-output-on (Befehlszeile), die tun können, was Sie brauchen, aber die eigentliche Frage ist, warum Sie das Bedürfnis haben, die Daten jedes Benutzers einzeln zu verschlüsseln. Es wird allgemein angenommen, dass, sobald ein Angreifer Ihre gespeicherten Daten sehen kann, er auch Ihren Quellcode sehen kann, der die meisten Verwendungen der internen Verschlüsselung so gut wie möglich widerlegt. – Sammitch

+0

@Sammitch In einigen Fällen ist es nützlich, wenn der Schlüssel zum Verschlüsseln/Entschlüsseln der Daten nirgends gefunden wird (und nur dem Benutzer gehört). Ich bin mir ziemlich sicher, dass LastPass das auch tut. – h2ooooooo

Antwort

46
$myVarIWantToEncodeAndDecode 

definieren Schlüssel (Salz, Brühe etc ..): $key = "#&$sdfdfs789fs7d";

zu kodieren:

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

zu entschlüsseln:

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

Hinweis: mcrypt_decrypt DEPRECATED wurde ab PHP 7.1.0. Von dieser Funktion wird dringend abgeraten.

+0

hmm .. Das scheint zu funktionieren, aber die Daten, die ich von der Entschlüsselung der Zeichenfolge zurückbekomme, sind "A" · fμŒ "÷ Óÿ ‰ Zvÿ" EE ¥ ‰ ¬DõØ & Hå§'. Was ist los mit dir? –

+0

Also dekodiert und codiert es richtig? Was codierst du? einfacher Text? codierten Daten sollte wie folgt aussehen: 'VXHE0iM0bMXQecCAKYAzYZjy4gbctqLGQHYvW2cFhaE =' – rinchik

+0

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

Verwandte Themen