Ich muss eine GET-Zeichenfolge an eine E-Mail übergeben, damit ein Benutzer auf bestimmte Buchungsdetails zugreifen kann. , d. H. /bookingconformation.php? BookingID = 123.Verständnis der Verschlüsselung mit base64 und mcrypt
Ich versuche, das BookingID mit base64 (bearbeiten und mcrypt) (in der Hoffnung, zu verschlüsseln, dass es fast unmöglich sein wird, zu erraten, und Zugriff auf andere Benutzern Buchung Details (obwohl die Buchungsdaten sind nicht wirklich zu empfindlich!)). Dies ist so, dass nur der vorgesehene Benutzer auf die Buchungsbestätigung zugreifen kann.
Ich verwende Code, der hauptsächlich hier (stackOverflow) gefunden wird, da ich weit entfernt von einem Verschlüsselungsexperten bin !!
Ich habe ein paar Probleme. Der Code ich benutze ist unten und darunter ist die Liste der Probleme i
/**
* a basic encryption for things like IDs, so links can be created and emailed to i.e booking details
* @param int/str $x what is to be encrypted
* @ENCRYPTION_KET str the encyption key
* @return encrypted string
*/
public static function basicEncrypt($x, $ENCRYPTION_KET) {
$key = pack('H*', $ENCRYPTION_KET);
$iv_size = mcrypt_get_iv_size(MCRYPT_RIJNDAEL_128, MCRYPT_MODE_CBC);
$iv = mcrypt_create_iv($iv_size, MCRYPT_RAND);
$ciphertext = mcrypt_encrypt(MCRYPT_RIJNDAEL_128, $key, $x, MCRYPT_MODE_CBC, $iv);
$ciphertext = $iv . $ciphertext;
$ciphertext_base64 = base64_encode($ciphertext);
$encrypted_x = urlencode($ciphertext_base64);
return $encrypted_x;
}
/**
* a basic de-cryption for things like IDs, so links can be created and emailed to i.e booking details
* @param str $x what is to be de-crypted
* @ENCRYPTION_KET str the encyption key
* @return decrypted string
*/
public static function basicDecrypt($x, $ENCRYPTION_KET) {
$x = urldecode($x);
$ciphertext_dec = base64_decode($x);
$key = pack('H*', $ENCRYPTION_KET);
$iv_size = mcrypt_get_iv_size(MCRYPT_RIJNDAEL_128, MCRYPT_MODE_CBC);
$iv = mcrypt_create_iv($iv_size, MCRYPT_RAND);
$iv_dec = substr($ciphertext_dec, 0, $iv_size);
$ciphertext_dec = substr($ciphertext_dec, $iv_size);
$de_crypted_x = mcrypt_decrypt(MCRYPT_RIJNDAEL_128, $key, $ciphertext_dec, MCRYPT_MODE_CBC, $iv_dec);
return $de_crypted_x;
}
Ausgabe 1 habe: mit basicEncrypt() gibt eine andere Verschlüsselungskette jedes Mal, wenn ich es verwenden (dh für die gleiche bookingID von 123). Solange es zu den gleichen zu entschlüsselt, ist es egal, wenn die Verschlüsselungszeichenfolge jedes Mal anders ist. Kann mir jemand mitteilen, ob das jedes Mal eine andere Zeichenkette zurückgeben soll und ich wäre auch dankbar, wenn eine (leicht verständliche) Erklärung gegeben werden könnte, warum das so ist?
Problem 2: Der obige Code die meiste Zeit funktioniert .... (vielleicht 80%) aber auch andere Zeiten es nicht auf die richtige Antwort nicht entschlüsseln ... Ich verstehe nicht, warum :-(wenn. jeder kann lassen sie mich wissen, was ich falsch mache, so dass es zu 100% der Zeit arbeitet, würde ich sehr dankbar
Ausgabe 3: (mögliche Ausgabe) ich bin mit urlencode() und urldecode(). Ich habe viel auf StackOverflow gelesen und kann nicht herausfinden, ob ich das verwenden sollte oder nicht! Ich vermute, Problem 2 kann dadurch verursacht werden, aber kann nicht gesehen, um den richtigen Weg von dann zu tun dies und URL-Sicherheit. Ich habe versucht, unter den urlencode mit etwas Ähnliches wie das Ersetzen (hier gefunden), aber dies führt dann die über 0% der Zeit
function base64_url_encode($input) {
return strtr($input, '+/=', '-_,');
}
function base64_url_decode($input) {
return strtr($input, '-_,', '+/=');
}
auch arbeiten, ist die Methode, die ich zu erlauben, bin mit der Benutzer, um ihre Buchungsdetails zu sehen OK/ratsam? (Wie erwähnt, sind die Daten nicht wirklich sensibel, es enthält nur den Benutzernamen, Buchung REF und was gebucht wurde. ID muss angezeigt werden, wenn der Benutzer für die (Hotel-) Buchung auftaucht.
Jede Hilfe, die mir erlaubt zu verstehen, was ich mache (und Verschlüsselung) ein wenig besser ist sehr geschätzt oder noch mehr geschätzt, wenn jemand darauf hinweisen kann (so dass ich korrigieren kann) die Fehler in meiner Methode wäre großartig! !
Vielen Dank für
an diesem :-) Ford sucht
@CharlotteDunois basee64_decode entschlüsselt nicht (wie Sie wissen) ... dekodiert. Ford: Issue1 ist kein Problem .. ein zufälliger "Initialisierungsvektor" wird jedes Mal verwendet ... resultierend in unterschiedlichen crypttext –
@BradKent und anderenPostern, ich sehe jetzt, was es anders ist ... einfach wirklich, aber ich tat es nicht Finde es heraus, bis es darauf hingewiesen wurde :-) – Ford
Du könntest dein Leben viel einfacher machen, wenn du [defuse/php-encryption] benutzt hast (https://github.com/defuse/php-encryption). –