PHP加密解密内部算法

PHP 21NN 4周前 (05-24) 3次浏览 已收录 0个评论 扫描二维码

最近学习 URL 跳转的时候新进三个超好用的 PHP 加密解密函数,貌似是discuz里的…使用这些加密解密的原因是因为有时自己的 URL 地址被人获取以后想破解你里面传值的内容就必须知道你的 key,没有 key,他应该要破了一阵子才能知道你 URL 里面的内容吧。

将它们打包成一个文件就叫 fun.php 吧

<?php
function passport_encrypt($txt, $key) {
srand((double)microtime() * 1000000);
$encrypt_key = md5(rand(0, 32000));
$ctr = 0;
$tmp = ”;
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 = ”;
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 = ”;
for($i = 0; $i < strlen($txt); $i++) {
$ctr = $ctr == strlen($encrypt_key) ? 0 : $ctr;
$tmp .= $txt[$i] ^ $encrypt_key[$ctr++];
}
return $tmp;
}
?>

以下是一些示例加深对这三个加密解密函数的理解

//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.”


”;
echo $encrypt.”


”;
echo $decrypt.”


”;
?>

//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.”


”;
echo $encrypt.”


”;
echo $decrypt.”


”;
echo $decryptArray.”


”;
?>

关键的地方来了当你要跳转到另外一个网址,但又要保证你的 session 无误的时候,你需要对 session 作一个处理.貌似一个公司有一个网站又
有一个论坛,两个地方都有注册和登录,但又不想让用户在主页登录后跳转到论坛的时候 session 失效,即是登录一次跑完整间公司

那要怎样来处理用户的 session 呢

网页都是无状态的,如果要在新的网页中继续使用 session,则需要把 session 从一个地方移到另一个地方,可能有些人已经想到了,我可以通
过 url 传址的方式来调用它.而 PHP 有个处理 session 的变量,叫$_SESSION.于是将需要注册的 session 转换成一个数组吧.那么,你
可以这样写:

//login.php
<?php
session_start();
include “fun.php”;
$_SESSION[“userid”];
$_SESSION[“username”];
$_SESSION[“userpwd”];

header(“Location: http://$domain/process.php?s=&#8221;.urlencode(passport_encrypt(serialize($_SESSION),”sessionkey”)));
?>

上例中先用 serialize 将$_SESSION 变成可存储的数据,然后通过 passport_encrypt 将这个数据加密,加 urlencode 的原因是因为$_SESSION 加密时,有可能会产生像料想不到的编码,所以以防万一(事实证明非常有效)

处理下先

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

先用$_GET[“s”]获取 URL 的参数,然后用 passport_decrypt 将其解密,再用 unserialize 将其数据还原成原始数据,到了这步处理,你的网页就可能通过 header 自由跳转啦。

这种方法还涉及到安全性的问题,如果你的 url 地址在传址的过程中被人家获取的话,那就真的是不好意思了人家虽然可能破解不了 url 里边的内容,但
人家也可以直接用这个 url 地址来登录你的一些个人账户啊,邮箱帐户啊甚至银行帐户(当然很少人会这样写,我例外,哈哈)听起来好怕.但其实你可以在跳转
页面作取消 session 处理.

以下是加强版的 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[“USERNAME”]和$_SESSION[“PASSWORD”]
这两个东东就是用户登录时需要输入的用户名和密码了.取消这两个 session 的原因就是因为如果你的 url 被人获取了,那个人虽然在超过 30 秒内跳转到
loign.php 的页面,但那些传过来的 session 依然有效,只要将 url 后缀 login.php 改为 index.php.那他一样登录成功。


乐趣公园 , 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权
转载请注明原文链接:PHP 加密解密内部算法
喜欢 (0)
[1353713598@qq.com]
分享 (0)
关于作者:
发表我的评论
取消评论
表情 贴图 加粗 删除线 居中 斜体 签到

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址