(转)PHP PEAR中用Text_Password轻松实现随机密码以及图形验证码

文件来源:PHP MORE第5期,作者:HaoHappy
http://info96.k12studio.com/~nio/weblog.php?id=P265
觉得有用,特抄录于此。

关于随机密码
系统自动生成随机密码或口令,这是WEB 程序常见的功能之一。例如这样的注册模式你一定不会感到陌生:当用户注册时,系统为用
户生成一个随机密码并发至其注册邮箱。用户登录自己的邮箱得到系统所给的随机密码后,再登录系统修改为自己想要的密码。这和直
接发送密码到用户邮箱相比,避免了用户密码在网络上的明文传输,大大增强了系统安全性。随机密码还常用于“忘记密码”功能,用
户忘记密码后,系统可以为之自动再生成一个密码。
/*随机字符串的生成还有一个很酷的应用就是验证码,PEAR 中有一个对应的类库Text_CAPTCHA。目前Text_CAPTCHA 还只是
Alpha 版本,所以我们暂不讨论,等到Stable 版本释出后我会向大家介绍。Text_CAPTCHA 就基于即将介绍的Text_Password
开发的。本文中也将会有一个图形验证码的实例,采用Text_Password+GD 开发。*/
我们在WEB 开发中生成的密码都是由数字,字母和特殊字符组成的。根据不同的组合方式,密码的类型可以大概分成纯数字型,纯字
母型,纯特殊字符型,数字字母混合型,数字字母特殊字符混合型等。

PEAR::Text_Password 简介
http://pear.php.net/package/Text_Password
今天向大家介绍的PEAR 类是PEAR::Text_Password,可以称之为随机密码生成器。PEAR::Text_Password 是个比较简单
的类,只包含一个PHP 文件(Password.php),代码连注释在内只有500 多行。Text_Password 易学易用,功能却相当强大,可以
满足WEB 应用中绝大部份情况下的需求(如果你觉得还需要定制一些自己的功能,可以将这个类库再开发,相当方便)。
Text_Password 的主要特性如下:
² 可创建多种格式的随机密码,如纯字母,纯数字,纯特殊字符及混用型密码;
² 可自定义密码的长度(字符数);
² 可限定密码中只能出现某些字符;
² 可一次性创建多个密码;
² 创建基于某个字符串的密码(非随机,使用不同算法对字符串进行处理,如翻转)。

Text_Password 把密码分为pronounceable(可发音的)和Unpronounceable(不可发音的)两种类型。可发音型即纯英文字
母型,虽然整个口令不是正常的英文单词,但一般可以划分出音节来发音,有助于记忆,例如“steagionea”。不可发音型则是混用
型,无法发音,如“miC106AIB7”。显然,可发音型容易记忆而安全性相对较差,不可发音型不易记忆但安全性较好。通常情况下我
们不太需要记忆随机密码,所以选用Unpronounceable 的情况较常见一些。你可以视实际情况选择。
系统需求:
PHP4.3.* /PHP5
PEAR::Text_Password
使用Text_Password,实际上我们使用到的只有四个类方法,通过传递不同的参数来生成所需的密码。四个类方法分别是
create(),createMultiple(),createFromLogin(),createMultipleFromLogin()。下面我们来举例说明它们的用法。

(1) 创建可发音密码
<?php
require_once "Text/Password.php";
echo "创建10 个字符的可发音密码....:<BR> ";
echo Text_Password::create(10,'Pronounceable') . "<P>";
echo "创建三个10 字符的可发音密码...:<BR> ";
print_r(Text_Password::createMultiple(3));
?>

(2) 创建不可发音密码
<?php
require_once "Text/Password.php";
echo "创建一个10 字符的不可发音密码....:<BR>";
echo Text_Password::create(10, 'unpronounceable') . "<P>";
echo "创建一个8 字符且只包含有a,b,c 的不可发音密码....:<BR>";
echo Text_Password::create(8, 'unpronounceable', 'a,b,c') . "<P>";
echo "<BR>同时创建4 个不可发音密码...:/n<BR>";
print_r(Text_Password::createMultiple(4, 10, 'unpronounceable'));
echo "<P>";
echo "创建一个长度为8 的只含有数字的不可发音密码:<BR>";
echo Text_Password::create(8, 'unpronounceable', 'numeric') . "<P>";
echo "创建一个长度为8 的只包含数字或字母的不可发音密码::<BR>";
echo Text_Password::create(8, 'unpronounceable', 'alphanumeric') . "<P>";
?>

(3) 创建基于某个字符串的密码
有时候我们希望得到的密码不完全随机,而是有一定规律的。我们希望根据我们所给的字符来获得最终的密码。这样有个好处就是可以
将密码还原成明文,只要我们知道算法。
Text_Password 内建了一些算法来对字符串进行处理。有以下几种算法(或可称操作):
· xor
· rotx
· rotx++
· rotx--
· ascii_rotx
· ascii_rotx++
· ascii_rotx--
· shuffle
· reverse
<?php
require_once "Text/Password.php";
echo "/n密码原文为: 'haohappy', 加密方法为: 'reverse',<BR>加密结果为:";
echo Text_Password::createFromLogin('haohappy', 'reverse') . "<P>";
echo "/n密码原文为 'haohappy', 加密方法为: 'rot13',<BR>加密结果为:";
echo Text_Password::createFromLogin('haohappy', 'rot13') . "<P>";
echo "/n密码原文为 'haohappy', 加密方法为: 'rotx',<BR>加密结果为:";
echo Text_Password::createFromLogin('haohappy', 'rotx', 13) . "<P>";
echo "/n密码原文为 'haohappy', 加密方法为: 'rotx++',<BR>加密结果为:";
echo Text_Password::createFromLogin('haohappy', 'rotx++' , 13) . "<P>";
echo "/n密码原文为 'haohappy', 加密方法为: 'rotx--',<BR>加密结果为:";
echo Text_Password::createFromLogin('haohappy', 'rotx--', 13) . "<P>";
echo "/n密码原文为 'haohappy', 加密方法为: 'xor',<BR>加密结果为:";
echo Text_Password::createFromLogin('haohappy', 'xor', 5) . "<P>";
echo "/n密码原文为 'haohappy', 加密方法为: 'ascii_rotx',<BR>加密结果为:";
echo Text_Password::createFromLogin('haohappy', 'ascii_rotx', 5) . "<P>";
echo "/n密码原文为 'haohappy', 加密方法为: 'ascii_rotx++',<BR>加密结果为:";
echo Text_Password::createFromLogin('haohappy', 'ascii_rotx++' , 5) . "<P>";
echo "/n密码原文为 'haohappy', 加密方法为: 'ascii_rotx--',<BR>加密结果为:";
echo Text_Password::createFromLogin('haohappy', 'ascii_rotx--', 5) . "<P>";
echo "/n密码原文为 'haohappy', 加密方法为: 'shuffle',<BR>加密结果为:";
echo Text_Password::createFromLogin('haohappy', 'shuffle', 1) . "<P>";
echo "/n<b>密码组</b>原文为: 'haohappy', 'martin', 'vanhoucke', 'jansen', 加密方法为: 'reverse':/n";
$logins = array('haohappy', 'martin', 'vanhoucke', 'jansen');
echo "结果如下:<pre>";
print_r(Text_Password::createMultipleFromLogin($logins, 'reverse'));
echo "</pre>";
?>
运行结果如图:
你可以按F5 刷新几次,会发现除了Shuffle 操作(打乱)之外,其它结果都是固定不变,也即非随机的。
以上即Text_Password 的三个主要应用,相信你已经初步掌握。

图形验证码
下面Haohappy 将给出一个应用实例,那就是大家都非常熟悉的图形验证码。虽然只是一个简单的例子,却是一个完整的验证码程序
的核心部份。思路是采用随机的背景图,再用不同的颜色写上随机字符串。
首先,我们准备三个图形背景文件,分别命名为bg1.png,bg2.png,bg3.png,放在images 目录下。
<?php
require_once "Text/Password.php";
$string = Text_Password::create(10, 'pronounceable');
$num = rand(1,3);
header("Content-type: image/png");
$im = imagecreatefrompng("images/bg$num.png");
switch ($num) {
case 1:
$orange = imagecolorallocate($im, 253, 238, 227); //字体颜色
break;
case 2:
$orange = imagecolorallocate($im, 255, 204, 51);
break;
case 3:
$orange = imagecolorallocate($im, 255,255,200);
break;
}
$px = (imagesx($im) - 7.5 * strlen($string)) / 2; //位置
imagestring($im, 5, $px-3, 2, $string, $orange); //写上随机字符串
imagepng($im);
imagedestroy($im);
?>
程序非常简单,只有二十多行,但功能算是相当强大,想使用程序进行边缘识别不那么容易,安全性较高。
至少比腾讯网站上QQ 免费注册的那个验证码强多了:) 当然你也可以再加入随机杂点,画线,使用随机字体,旋转等等(如果有必
要的话)。你可以在网页中加入<IMAGE SRC='imagetest2.php'>来引用该验证码,配合Session,就可以在用户登录时进行图形
验证码认证。具体不详述,没什么难度。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值