Maison  >  Article  >  développement back-end  >  Comment l'algorithme interne de cryptage et de décryptage PHP est-il implémenté ?

Comment l'algorithme interne de cryptage et de décryptage PHP est-il implémenté ?

伊谢尔伦
伊谢尔伦original
2017-07-08 10:50:291110parcourir

Lorsque j'apprenais le saut d'URL récemment, je suis tombé sur trois fonctions de cryptage et de décryptage PHP super faciles à utiliser, qui semblent être en discussion... La raison pour laquelle j'utilise ces cryptages et décryptages est que parfois quelqu'un veut crackez votre adresse URL après son obtention. Le contenu de la valeur doit connaître votre clé. Sans la clé, il faudra un certain temps pour connaître le contenu de votre URL.

Regroupez-les dans un fichier et appelez-le fun.php

Le code est le suivant :

<?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; 
} 
?>

Voici quelques exemples pour approfondir le cryptage et décryptage de ces trois La compréhension de la fonction

est la suivante :

//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>”; 
?>

Le point clé est lorsque vous souhaitez accéder à une autre URL, mais vous devez vous assurer que votre sessionLorsque tout est correct, vous devez traiter la session. Il semble qu'une entreprise ait un site Web et un forum, et les deux endroits ont une inscription et une connexion, mais ils ne veulent pas que les utilisateurs y accèdent. le forum après s'être connecté sur la page d'accueil. Invalide, c'est-à-dire se connecter une fois pour gérer toute l'entreprise

Comment gérer la session de l'utilisateur ?

Les pages Web sont apatrides. continuer à utiliser la session dans une nouvelle page Web, je dois alors déplacer la session d'un endroit à un autre. Certaines personnes ont peut-être pensé que je pouvais l'appeler en passant l'URL. PHP a une variable pour traiter les sessions appelée $_SESSION. La session qui doit donc être enregistrée est Convertissez-le en tableau. Ensuite, vous pouvez écrire comme ceci :

Le code est le suivant :

//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"))); 
?>

Dans ce qui précède. Par exemple, la sérialisation est d'abord utilisée pour transformer $_SESSION en données stockables. Ensuite, cryptez ces données via passeport_encrypt. La raison de l'ajout du code urlen est que lorsque $_SESSION est crypté, un codage inattendu peut être généré, donc juste au cas où (cela s'avère être le cas). très efficace)

Traitons-le d'abord

Le code est le suivant :

//process.php 
<?php 
session_start(); 
include “fun.php”; 
$_SESSION=unserialize(passport_decrypt($_GET["s"],"sessionkey")); 
header("Location: http://$domain/index.php"); 
?>


Utilisez d'abord $_GET["s"] pour obtenir les paramètres de l'URL, puis utilisez passeport_decrypt pour la déchiffrer, puis utilisez unserialize pour désérialiser les données. Restaurez les données d'origine À cette étape du traitement, votre page Web peut parcourir librement l'en-tête.

Cette méthode implique également des problèmes de sécurité. Si votre adresse URL est obtenue par d'autres personnes pendant le processus de transmission de l'adresse, ce serait vraiment embarrassant, même si ces personnes ne pourraient pas déchiffrer le contenu de l'URL. Vous pouvez également utiliser directement cette adresse URL pour vous connecter à certains de vos comptes personnels, comptes de messagerie et même comptes bancaires (bien sûr, peu de gens écriront comme ça, je suis une exception, haha, mais en fait). , vous pouvez sauter Transférer la page pour annuler la session

Ce qui suit est la version améliorée de process.php

Le code est le suivant :

<?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"); 
?>

Avant d'écrire ce fichier, vous devez définir du côté de la connexion

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

La raison de ce réglage est principalement d'obtenir l'heure. des deux côtés, si le saut dépasse 30 secondes, vous pouvez le laisser accéder à la page de connexion login.php. Les clients ayant une vitesse Internet lente seront gênés, mais cela évite également que cette URL soit obtenue par quelqu'un, et que la personne le fasse. ne vous connectez pas dans les 30 secondes, alors Désolé, veuillez vous reconnecter après l'expiration du délai

$_SESSION["USERNAME"] et $_SESSION["PASSWORD"] sont le nom d'utilisateur et le mot de passe dont les utilisateurs ont besoin. entrez lors de la connexion Oui. La raison de l'annulation de ces deux sessions est que si votre URL est obtenue par quelqu'un, même si cette personne accédera à la page logon.php dans plus de 30 secondes, les sessions passées sont toujours valides. Changez simplement le suffixe de l'URL. Changez login.php en index.php. Il pourra alors toujours se connecter avec succès.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn