Mit mcrypt passieren Daten über einen Webservice schlägt fehl
Frage
Ich schreibe eine Fehlerbehandlungsroutine Skript, das die Fehlerdaten verschlüsselt (Datei, Linie, Fehler-Nachricht, etc.) und leitet die serialisierten Array als POST-Variable (unter Verwendung von curl) auf ein Skript, das dann protokolliert den Fehler in einem zentralen db.
Ich habe meine Verschlüsselungs- / Entschlüsselungs-Funktionen in einer einzigen Datei geprüft und die Daten werden verschlüsselt und entschlüsselt in Ordnung:
define('KEY', 'abc');
define('CYPHER', 'blowfish');
define('MODE', 'cfb');
function encrypt($data) {
$td = mcrypt_module_open(CYPHER, '', MODE, '');
$iv = mcrypt_create_iv(mcrypt_enc_get_iv_size($td), MCRYPT_RAND);
mcrypt_generic_init($td, KEY, $iv);
$crypttext = mcrypt_generic($td, $data);
mcrypt_generic_deinit($td);
return $iv.$crypttext;
}
function decrypt($data) {
$td = mcrypt_module_open(CYPHER, '', MODE, '');
$ivsize = mcrypt_enc_get_iv_size($td);
$iv = substr($data, 0, $ivsize);
$data = substr($data, $ivsize);
if ($iv)
{
mcrypt_generic_init($td, KEY, $iv);
$data = mdecrypt_generic($td, $data);
}
return $data;
}
echo "<pre>";
$data = md5('');
echo "Data: $data\n";
$e = encrypt($data);
echo "Encrypted: $e\n";
$d = decrypt($e);
echo "Decrypted: $d\n";
Ausgang:
Data: d41d8cd98f00b204e9800998ecf8427e
Encrypted: ê÷#¯KžViiÖŠŒÆÜ,ÑFÕUW£´Œt?†÷>c×åóéè+„N
Decrypted: d41d8cd98f00b204e9800998ecf8427e
Das Problem ist, wenn ich die Verschlüsselungsfunktion in meiner Sendedatei setzen (tx.php) und die Entschlüsselung in meiner recieve-Datei (rx.php), werden die Daten nicht vollständig entschlüsseln (beide Dateien haben den gleichen Satz von Konstanten für Schlüssel, Chiffre und Modus).
Data before passing: a:4:{s:3:"err";i:1024;s:3:"msg";s:4:"Oops";s:4:"file";s:46:"/Applications/MAMP/htdocs/projects/txrx/tx.php";s:4:"line";i:80;}
Data decrypted: Mª4:{s:3:"err";i:1024@7OYªç`^;g";s:4:"Oops";s:4:"file";sôÔ8F•Ópplications/MAMP/htdocs/projects/txrx/tx.php";s:4:"line";i:80;}
Beachten Sie die zufälligen Zeichen in der Mitte.
Meine curl ist ziemlich einfach:
$ch = curl_init($url);
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, 'data=' . $data);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$output = curl_exec($ch);
Dinge, die ich vermute, könnte dies verursacht werden:
- Codierung des curl Anfrage
- Etwas mit mcrypt Polsterung zu tun Bytes fehlt
- Ich habe zu lange auf sie gestarrt und haben etwas verpasst wirklich wirklich offensichtlich
Wenn ich die Krypta Funktionen deaktivieren (so die Übertragung TX-> rx unverschlüsselt) die Daten in Ordnung empfangen wird.
Jede und alle Hilfe sehr geschätzt!
Danke, Adam
Lösung 2
ich es herausgefunden - hatte die Daten nach der Verschlüsselung base64_encode
und dann base64_decode
vor Entschlüsseln
Dank denen, die eine in meinem Namen denken hatten!
Andere Tipps
Die verschlüsselten Daten binär aber du hast URL nicht verschlüsselt. Tun Sie dies in der CURL,
$ch = curl_init($url);
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, 'data=' . urlencode($data));
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$output = curl_exec($ch);
Auch diese Antworten waren für mich in Ordnung. Base64_encode ist noch nicht sicher und hat Probleme mit Leerzeichen und Pluszeichen für längere Strings. Ich fand dieser Funktionen hilfreich:
<?php
function urlsafe_b64encode($string)
{
$data = base64_encode($string);
$data = str_replace(array('+','/','='),array('-','_','.'),$data);
return $data;
}
function urlsafe_b64decode($string)
{
$data = str_replace(array('-','_','.'),array('+','/','='),$string);
$mod4 = strlen($data) % 4;
if ($mod4) {
$data .= substr('====', $mod4);
}
return base64_decode($data);
}
?>
Hope, das hilft jemand.