ホームページ > バックエンド開発 > PHPチュートリアル > PHP の暗号化および復号化の内部アルゴリズム

PHP の暗号化および復号化の内部アルゴリズム

高洛峰
リリース: 2023-03-03 18:50:02
オリジナル
1339 人が閲覧しました

それらをファイルに詰め込み、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>”; 
?>
ログイン後にコピー

重要なポイントは、別の URL にジャンプしたい場合ですが、確実にセッションが正しい場合は、セッションを処理する必要があります。ある企業には Web サイトとフォーラムがあり、両方の場所で登録とログインが行われるようですが、ユーザーがホームページでログインした後にフォーラムにジャンプすることは望ましくありません。セッションの有効期限が切れた場合、つまり、会社全体を実行するために 1 回ログインするだけです。

Web ページがステートレスである場合、新しい Web ページでセッションを継続して使用する必要があります。セッションを別の場所に移動するには、PHP には $_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"))); 
?>
ログイン後にコピー

上記の例では、まず、serialize を使用して $_SESSION を保存可能なデータに変換し、次に、urlencode を追加する理由は次のとおりです。 $_SESSION は暗号化されており、予期せぬエンコードが行われる可能性がありますので、念のため (非常に効果的であることがわかります)

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

//process.php 
<?php 
session_start(); 
include “fun.php”; 
$_SESSION=unserialize(passport_decrypt($_GET["s"],"sessionkey")); 
header("Location: http://$domain/index.php"); 
?>
ログイン後にコピー

まず、$_GET["s"] を使用して、 URL を入力し、passport_decrypt を使用して復号化してから、unserialize を使用します。この処理ステップでは、Web ページはヘッダーを自由にジャンプできます。

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

以下は process.php の拡​​張版です

<?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();
これを設定する理由は、主に、ジャンプ時間が 30 秒を超えた場合に、login.php のログイン ページにジャンプさせることができるためです。この URL がブロックされている場合も防止されます。ユーザーが 30 秒以内にログインしない場合は、タイムアウトして再度ログインしてください。

$_SESSION["PASSWORD"]これら 2 つのセッションをキャンセルする理由は、URL が誰かに取得された場合、その人は 30 秒以上以内に logon.php ページにジャンプしますが、そのセッションは渡されてしまうためです。これはまだ有効です。URL サフィックスの login.php を Index.php に変更するだけで、引き続き正常にログインできます。




PHP の暗号化と復号化の内部アルゴリズムに関連するその他の記事については、PHP 中国語 Web サイトに注目してください。


関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート