PHP 加密解密内部算法


Posted in PHP onApril 22, 2010

将它们打包成一个文件就叫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.”<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>”; 
?>

关键的地方来了当你要跳转到另外一个网址,但又要保证你的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=".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"); 
?>

先用$_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.那他一样登录成功。

PHP 相关文章推荐
解析php中heredoc的使用方法
Jun 17 PHP
PHP实现多进程并行操作的详解(可做守护进程)
Jun 18 PHP
PHP CURL CURLOPT参数说明(curl_setopt)
Sep 30 PHP
PHP连接MySQL查询结果中文显示乱码解决方法
Oct 25 PHP
php制作中间带自己定义图片二维码的方法
Jan 27 PHP
PHP GD库生成图像的几个函数总结
Nov 19 PHP
php控制文件下载速度的方法
Mar 24 PHP
浅谈PHP eval()函数定义和用法
Jun 21 PHP
PHP网站自动化配置的实现方法(必看)
May 27 PHP
PHP异常处理定义与使用方法分析
Jul 25 PHP
PHP实现求连续子数组最大和问题2种解决方法
Dec 26 PHP
Yii 使用intervention/image拓展实现图像处理功能
Jun 22 PHP
PHP 根据IP地址控制访问的代码
Apr 22 #PHP
收集的二十一个实用便利的PHP函数代码
Apr 22 #PHP
让PHP开发者事半功倍的十大技巧小结
Apr 20 #PHP
php快速url重写 更新版[需php 5.30以上]
Apr 20 #PHP
一个PHP的String类代码
Apr 20 #PHP
使用PHP提取视频网站页面中的FLASH地址的代码
Apr 17 #PHP
来自phpguru得Php Cache类源码
Apr 15 #PHP
You might like
php 表单验证实现代码
2009/03/10 PHP
如何用php生成扭曲及旋转的验证码图片
2013/06/07 PHP
php基于session实现数据库交互的类实例
2015/08/03 PHP
JavaScript Sort 表格排序
2009/10/31 Javascript
js简单实现根据身份证号码识别性别年龄生日
2013/11/29 Javascript
javascritp添加url参数将参数加入到url中
2014/09/25 Javascript
js实现文本框支持加减运算的方法
2015/08/19 Javascript
ES6中如何使用Set和WeakSet
2016/03/10 Javascript
jQuery通过ajax请求php遍历json数组到table中的代码(推荐)
2016/06/12 Javascript
微信小程序 Button 组件详解及简单实例
2017/01/10 Javascript
AngularJS中使用three.js的实例详解
2017/07/21 Javascript
js 取消页面可以选中文字的功能方法
2018/01/02 Javascript
JS中appendChild追加子节点无效的解决方法
2018/10/14 Javascript
vue中tab选项卡的实现思路
2018/11/25 Javascript
JS数组求和的常用方法总结【5种方法】
2019/01/14 Javascript
Python天气预报采集器实现代码(网页爬虫)
2012/10/07 Python
Python中的进程分支fork和exec详解
2015/04/11 Python
Python编程对列表中字典元素进行排序的方法详解
2017/05/26 Python
Python实现的递归神经网络简单示例
2017/08/11 Python
Python socket实现的简单通信功能示例
2018/08/21 Python
Python安装依赖(包)模块方法详解
2020/02/14 Python
HTML5之SVG 2D入门1—SVG(可缩放矢量图形)概述
2013/01/30 HTML / CSS
css 如何让背景图片拉伸填充避免重复显示
2013/07/11 HTML / CSS
浅谈HTML5 &amp; CSS3的新交互特性
2016/07/19 HTML / CSS
英国奢侈品网站:MatchesFashion
2016/12/16 全球购物
史上最全面的Java面试题汇总!
2015/02/03 面试题
金融专业个人的自我评价
2013/10/18 职场文书
如何写毕业求职自荐信
2013/11/06 职场文书
银行演讲稿范文
2014/01/03 职场文书
料理师求职信
2014/01/30 职场文书
消防安全员岗位职责
2014/03/10 职场文书
座谈会主持词
2014/03/20 职场文书
小学综治宣传月活动总结
2014/07/02 职场文书
质量主管工作职责
2014/09/26 职场文书
详解Spring事件发布与监听机制
2021/06/30 Java/Android
Python如何解决secure_filename对中文不支持问题
2021/07/16 Python