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 adodb分页实现代码
Mar 19 PHP
8个出色的WordPress SEO插件收集
Feb 26 PHP
有关phpmailer的详细介绍及使用方法
Jan 28 PHP
php后台如何避免用户直接进入方法实例
Oct 15 PHP
php中Ctype函数用法详解
Dec 09 PHP
PHP树的深度编历生成迷宫及A*自动寻路算法实例分析
Mar 10 PHP
PHP实现QQ快速登录的方法
Sep 28 PHP
phpmyadmin下载、安装、配置教程
May 16 PHP
PHP查询分页的实现代码
Jun 09 PHP
PHP实现的用户注册表单验证功能简单示例
Feb 25 PHP
PHP实现获取ip地址的5种方法,以及插入用户登录日志操作示例
Feb 28 PHP
Thinkphp 框架基础之入口文件功能、定义与用法分析
Apr 27 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
BBS(php &amp; mysql)完整版(四)
2006/10/09 PHP
php中变量及部分适用方法
2008/03/27 PHP
php创建多级目录代码
2008/06/05 PHP
php 魔术方法使用说明
2009/10/20 PHP
PHP使用json_encode函数时不转义中文的解决方法
2014/11/12 PHP
PHP批量去除BOM头内容信息代码
2016/03/11 PHP
php正则提取html图片(img)src地址与任意属性的方法
2017/02/08 PHP
Javascript开发包大全整理
2006/12/22 Javascript
javascript smipleChart 简单图标类
2011/01/12 Javascript
javascript中全局对象的isNaN()方法使用介绍
2013/12/19 Javascript
莱鸟介绍window.print()方法
2016/01/06 Javascript
纯JS代码实现一键分享功能
2016/04/20 Javascript
javaScript+turn.js实现图书翻页效果实例代码
2017/02/16 Javascript
vue双向绑定简要分析
2017/03/23 Javascript
解决vue-cli中stylus无法使用的问题方法
2017/06/19 Javascript
基于hover的用法实例(推荐)
2017/07/04 Javascript
vue 路由页面之间实现用手指进行滑动的方法
2018/02/23 Javascript
vue 实现cli3.0中使用proxy进行代理转发
2019/10/30 Javascript
vue实现计步器功能
2019/11/01 Javascript
vue使用recorder.js实现录音功能
2019/11/22 Javascript
JavaScript设计模型Iterator实例解析
2020/01/22 Javascript
Python字符遍历的艺术
2008/09/06 Python
Python中for循环控制语句用法实例
2015/06/02 Python
Python的Flask框架中的Jinja2模板引擎学习教程
2016/06/30 Python
python在Windows下安装setuptools(easy_install工具)步骤详解
2016/07/01 Python
Python文件与文件夹常见基本操作总结
2016/09/19 Python
Python TestCase中的断言方法介绍
2019/05/02 Python
python DataFrame转dict字典过程详解
2019/12/26 Python
Python 使用 environs 库定义环境变量的方法
2020/02/25 Python
python rsa-oaep加密的示例代码
2020/09/23 Python
详解HTML5 LocalStorage 本地存储
2016/12/23 HTML / CSS
什么是ARP(Address Resolution Protocol)地址解析协议
2013/10/31 面试题
GWebs公司笔试题
2012/05/04 面试题
史上最全面的Java面试题汇总!
2015/02/03 面试题
质量承诺书怎么写
2014/05/24 职场文书
请学会珍惜眼前,因为人生没有下辈子!
2019/11/12 职场文书