Heim  >  Artikel  >  Backend-Entwicklung  >  Interner PHP-Verschlüsselungs- und Entschlüsselungsalgorithmus

Interner PHP-Verschlüsselungs- und Entschlüsselungsalgorithmus

高洛峰
高洛峰Original
2016-12-21 09:57:071328Durchsuche

Packen Sie sie in eine Datei und nennen Sie sie fun.php

<?php 
function passport_encrypt($txt, $key) { 
srand((double)microtime() * 1000000); 
$encrypt_key = md5(rand(0, 32000)); 
$ctr = 0; 
$tmp = &#39;&#39;; 
for($i = 0;$i < strlen($txt); $i++) { 
$ctr = $ctr == strlen($encrypt_key) ? 0 : $ctr; 
$tmp .= $encrypt_key[$ctr].($txt[$i] ^ $encrypt_key[$ctr++]); 
} 
return base64_encode(passport_key($tmp, $key)); 
} 

function passport_decrypt($txt, $key) { 
$txt = passport_key(base64_decode($txt), $key); 
$tmp = &#39;&#39;; 
for($i = 0;$i < strlen($txt); $i++) { 
$md5 = $txt[$i]; 
$tmp .= $txt[++$i] ^ $md5; 
} 
return $tmp; 
} 

function passport_key($txt, $encrypt_key) { 
$encrypt_key = md5($encrypt_key); 
$ctr = 0; 
$tmp = &#39;&#39;; 
for($i = 0; $i < strlen($txt); $i++) { 
$ctr = $ctr == strlen($encrypt_key) ? 0 : $ctr; 
$tmp .= $txt[$i] ^ $encrypt_key[$ctr++]; 
} 
return $tmp; 
} 
?>

Im Folgenden finden Sie einige Beispiele, um das Verständnis dieser drei Ver- und Entschlüsselungsfunktionen zu vertiefen

//string.php 
<?php 
include “fun.php”; 

$txt = “This is a test”; 
$key = “testkey”; 
$encrypt = passport_encrypt($txt,$key); 
$decrypt = passport_decrypt($encrypt,$key); 

echo $txt.”<br><hr>”; 
echo $encrypt.”<br><hr>”; 
echo $decrypt.”<br><hr>”; 
?> 

//array.php 
<?php 
include “fun.php”; 

$array = array( 
"a" => "1", 
"b" => "2", 
"c" => "3", 
"d" => "4" 
); 
//serialize产生一个可存储的值,返回一个字符串,unserialize还原 
$txt = serialize($array); 
$key = “testkey”; 
$encrypt = passport_encrypt($txt,$key); 
$decrypt = passport_decrypt($encrypt,$key); 
$decryptArray = unserialize($decrypt); 

echo $txt.”<br><hr>”; 
echo $encrypt.”<br><hr>”; 
echo $decrypt.”<br><hr>”; 
echo $decryptArray.”<br><hr>”; 
?>

Der Schlüssel Punkte: Wenn Sie zu einer anderen Website springen möchten, aber sicherstellen möchten, dass Ihre Sitzung korrekt ist, müssen Sie die Sitzung verarbeiten. Es scheint, dass ein Unternehmen über eine Website und ein Forum verfügt und beide Orte über eine Registrierung und Anmeldung verfügen Ich möchte nicht, dass die Sitzung des Benutzers ungültig wird, wenn er nach der Anmeldung auf der Startseite zum Forum springt, d.

Die Webseiten sind alle zustandslos. Wenn Sie die Sitzung auf einer neuen Webseite weiterverwenden möchten, müssen Sie die Sitzung von einem Ort an einen anderen verschieben. Ich kann es aufrufen, indem ich die URL übergebe. Es gibt eine Variable namens $_SESSION, die registriert werden muss. Dann können Sie Folgendes schreiben:

Verwenden Sie im obigen Beispiel zuerst serialize, um $_SESSION in zu ändern. Die speicherbaren Daten werden dann über Passport_encrypt verschlüsselt. Der Grund für das Hinzufügen von URL-Code liegt darin, dass bei der Verschlüsselung von $_SESSION möglicherweise unerwartete Codierungen generiert werden Fall (es erweist sich als sehr effektiv)
//login.php 
<?php 
session_start(); 
include “fun.php”; 
$_SESSION[“userid”]; 
$_SESSION[“username”]; 
$_SESSION[“userpwd”]; 

header("Location: http://$domain/process.php?s=".urlencode(passport_encrypt(serialize($_SESSION),"sessionkey"))); 
?>

Für die Verarbeitung verwenden Sie zuerst

Verwenden Sie $_GET["s"], um die Parameter der URL abzurufen, und verwenden Sie dann Passport_decrypt zum Entschlüsseln es, und verwenden Sie dann unserialize, um die Daten auf die ursprünglichen Daten wiederherzustellen. In diesem Verarbeitungsschritt kann Ihre Webseite frei durch den Header springen.
//process.php 
<?php 
session_start(); 
include “fun.php”; 
$_SESSION=unserialize(passport_decrypt($_GET["s"],"sessionkey")); 
header("Location: http://$domain/index.php"); 
?>

Diese Methode bringt auch Sicherheitsprobleme mit sich, wenn Ihre URL-Adresse während des Adressübertragungsprozesses an Dritte weitergegeben wird. Es kann zwar sein, dass sie den Inhalt der URL nicht entschlüsseln können, aber andere Sie können diese URL-Adresse auch direkt verwenden, um sich bei einigen Ihrer persönlichen Konten, E-Mail-Konten und sogar Bankkonten anzumelden (natürlich werden nur wenige Leute so schreiben, ich bin eine Ausnahme, haha). Aber in der Tat klingt es beängstigend , Sie können die Seite übertragen, um die Sitzung abzubrechen

Das Folgende ist die erweiterte Version von process.php

Bevor Sie diese Datei schreiben, müssen Sie die Anmeldeseite einrichten
<?php 
session_start(); 
include_once "fun.php"; 
$_SESSION=unserialize(passport_decrypt($_GET["s"],"sessionkey")); 
if((time()-$_SESSION["TIME"])>30){ 
header("Location: http://$domain/ login.php"); 
unset($_SESSION["USERNAME"]); 
unset($_SESSION["PASSWORD"]); 
} 
else 
header("Location: http://$domain/ index.php"); 
?>

$ _SESSION["TIME"] = time();


Der Hauptgrund für die Einstellung besteht darin, die Zeit auf beiden Seiten zu ermitteln. Sie können es springen lassen. Die Anmeldeseite von login.php ist für Kunden mit langsamer Netzwerkgeschwindigkeit peinlich, verhindert aber auch, dass es peinlich wird, wenn jemand diese URL erhält und sich die Person nicht innerhalb von 30 Sekunden anmeldet Der Benutzer muss sich nach einer Zeitüberschreitung erneut anmelden. $_SESSION["USERNAME"] und $_SESSION["PASSWORD"] sind der Benutzername und das Passwort, die Benutzer beim Anmelden eingeben müssen. Der Grund dafür Das Abbrechen dieser beiden Sitzungen liegt daran, dass Ihre URL von jemandem abgerufen wurde, obwohl diese Person innerhalb von mehr als 30 Sekunden zur Seite login.php springt, solange das URL-Suffix login.php geändert wird zu index.php, wird er sich trotzdem erfolgreich anmelden.




Weitere Artikel zu internen PHP-Verschlüsselungs- und -Entschlüsselungsalgorithmen finden Sie auf der chinesischen PHP-Website!


Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn