ホームページ  >  記事  >  バックエンド開発  >  PHP の暗号化と復号化の内部アルゴリズムはどのように実装されていますか?

PHP の暗号化と復号化の内部アルゴリズムはどのように実装されていますか?

伊谢尔伦
伊谢尔伦オリジナル
2017-07-08 10:50:291084ブラウズ

最近、URL ジャンプについて学習しているときに、Discuz にあると思われる 3 つの非常に使いやすい PHP 暗号化および復号化関数を見つけました。これらの暗号化および復号化を使用する理由は、URL アドレスが渡された値を解読しようとする誰かによって取得されます。コンテンツを見つけるには、キーを知っている必要があります。キーがなければ、相手が URL のコンテンツを知るまでに時間がかかります。

それらをファイルにパッケージ化して、 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; 
} 
?>

以下は、これら 3 つの暗号化および復号化関数の理解を深めるためのいくつかの例です

コードは次のとおりです:

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

重要な点は、別の Web サイトにジャンプしたいが、セッションが正しいことを確認したい場合は、セッションを処理する必要があるということです。企業には Web サイトとフォーラムがあり、両方の場所にあるようです。登録してログインしますが、ホームページでログインした後にフォーラムにジャンプするときにユーザーのセッションが無効になることは望ましくありません。つまり、一度ログインして会社全体を実行することです

それでは、ユーザーのセッションをどのように処理するか

Web ページはステートレスであるため、新しい Web ページでセッションを使用し続ける場合は、セッションをある場所から別の場所に移動する必要があると考えた人もいるかもしれません。 URL にはセッションを処理するための変数があるので、登録する必要があるセッションを配列に変換します:

コードは次のとおりです。上記の例では、まず Serialize を使用して $_SESSION を保存可能なデータに変換し、次に、passport_encrypt を渡してこのデータを暗号化し、urlencode を追加します。これは、$_SESSION が暗号化されると、予期しないエンコードが生成される可能性があるためです。非常に効果的です)

まずそれに対処しましょう


コードは次のとおりです:

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

まず、$_GET["s"] を使用して URL のパラメータを取得し、次に、passport_decrypt を使用して復号化し、次に使用しますunserialize を使用してデータを元のデータに戻します。この処理ステップでは、Web ページがヘッダー La を自由にジャンプする可能性があります。


この方法にはセキュリティの問題もあります。アドレス送信プロセス中に他の人に URL アドレスが取得されると、非常に恥ずかしいことになりますが、URL の内容を解読することはできません。この URL アドレスを使用して、個人アカウント、電子メール アカウント、さらには銀行口座にログインすることもできます (もちろん、これを書く人は私以外にはほとんどいないと思いますが、実際はすぐにキャンセルできます)。ページのセッション処理です。

以下は process.php の拡​​張バージョンです


コードは次のとおりです:

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

このファイルを書き込む前に、ログイン側で設定する必要があります

$_SESSION[" "] = time();

これを設定する理由は、主に両側の時間を取得するためです。ジャンプに 30 秒以上かかる場合は、login.php ログイン ページにジャンプさせることができます。ネットワークが遅いお客様速度が落ちてしまうかもしれませんが、これは予防策でもあります。この URL が誰かによって取得され、その人が 30 秒以内にログインしなかった場合は、申し訳ありませんが、タイムアウト後に再度ログインしてください。 $_SESSION["PASSWORD"] これら 2 つの Dongdong は、
ユーザーがログインするときに入力する必要があるユーザー名とパスワードです
​​。これら 2 つのセッションをキャンセルする理由は、あなたの URL が誰かに取得された場合、その人は、 30 秒以内に logon.php ページにアクセスできますが、URL 接尾部のlogin.phpがindex.phpに変更されている限り、渡されたセッションは引き続き有効です。

以上がPHP の暗号化と復号化の内部アルゴリズムはどのように実装されていますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。