文章详情

  • 游戏榜单
  • 软件榜单
关闭导航
热搜榜
热门下载
热门标签
php爱好者> php文档>PEAR探奇系列之PEAR::Text_Password

PEAR探奇系列之PEAR::Text_Password

时间:2008-05-27  来源:剑心通明



关于随机密码

系统自动生成随机密码或口令,这是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) 创建可发音密码
PronounceablePWD.php
require_once "Text/Password.php";
echo "创建10个字符的可发音密码....:
";
echo Text_Password::create(10,'Pronounceable') . "";
echo "创建三个10字符的可发音密码...:
";
print_r(Text_Password::createMultiple(3));
?>

运行结果如图:


在这个程序中,我们使用create()来创建一个长度为10,类型为pronounceable的密码;使用createMultiple()来同时创建三个长度为10,类型为pronounceable的密码密码。

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



(2) 创建基于某个字符串的密码
有时候我们希望得到的密码不完全随机,而是有一定规律的。我们希望根据我们所给的字符来获得最终的密码。这样有个好处就是可以将密码还原成明文,只要我们知道算法。

Text_Password内建了一些算法来对字符串进行处理。有以下几种算法(或可称操作):
·         xor
·         rotx
·         rotx++
·         rotx--
·         ascii_rotx
·         ascii_rotx++
·         ascii_rotx--
·         shuffle
·         reverse
GivenStrPWD.php
require_once "Text/Password.php";
echo "\n密码原文为: 'haohappy', 加密方法为: 'reverse',
加密结果为:";
echo Text_Password::createFromLogin('haohappy', 'reverse') . "";
echo "\n密码原文为 'haohappy', 加密方法为: 'rot13',
加密结果为:";
echo Text_Password::createFromLogin('haohappy', 'rot13') . "";
echo "\n密码原文为 'haohappy', 加密方法为: 'rotx',
加密结果为:";
echo Text_Password::createFromLogin('haohappy', 'rotx', 13) . "";
echo "\n密码原文为 'haohappy', 加密方法为: 'rotx++',
加密结果为:";
echo Text_Password::createFromLogin('haohappy', 'rotx++', 13) . "";
echo "\n密码原文为 'haohappy', 加密方法为: 'rotx--',
加密结果为:";
echo Text_Password::createFromLogin('haohappy', 'rotx--', 13) . "";
echo "\n密码原文为 'haohappy', 加密方法为: 'xor',
加密结果为:";
echo Text_Password::createFromLogin('haohappy', 'xor', 5) . "";
echo "\n密码原文为 'haohappy', 加密方法为: 'ascii_rotx',
加密结果为:";
echo Text_Password::createFromLogin('haohappy', 'ascii_rotx', 5) . "";
echo "\n密码原文为 'haohappy', 加密方法为: 'ascii_rotx++',
加密结果为:";
echo Text_Password::createFromLogin('haohappy', 'ascii_rotx++', 5) . "";
echo "\n密码原文为 'haohappy', 加密方法为: 'ascii_rotx--',
加密结果为:";
echo Text_Password::createFromLogin('haohappy', 'ascii_rotx--', 5) . "";
echo "\n密码原文为 'haohappy', 加密方法为: 'shuffle',
加密结果为:";
echo Text_Password::createFromLogin('haohappy', 'shuffle', 1) . "";
echo "\n密码组原文为: 'haohappy', 'martin', 'vanhoucke', 'jansen', 加密方法为: 'reverse':\n";
$logins = array('haohappy', 'martin', 'vanhoucke', 'jansen');
echo "结果如下:";
print_r(Text_Password::createMultipleFromLogin($logins, 'reverse'));
echo "";
?>

运行结果如图:
你可以按F5刷新几次,会发现除了Shuffle操作(打乱)之外,其它结果都是固定不变,也即非随机的。











以上即Text_Password的三个主要应用。


应用实例――图形验证码

下面Haohappy将给出一个应用实例,那就是大家都非常熟悉的图形验证码。虽然只是一个简单的例子,却是一个完整的验证码程序的核心部份。思路是采用随机的背景图,再用不同的颜色写上随机字符串。

首先,我们准备三个图形背景文件,分别命名为bg1.png,bg2.png,bg3.png,放在images目录下。












代码如下:
ImageCode.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);
?>

运行结果如下:





左图为随机码类型pronounceable,右图为unpronounceable
使用Text_Password的好处就在这里,可以非常方便地使用你想要的随机码类型。


程序非常简单,只有二十多行,但功能算是相当强大,想使用程序进行边缘识别不那么容易,安全性较高。
至少比腾讯网站上QQ免费注册的那个验证码强多了:)  当然你也可以再加入随机杂点,画线,使用随机字体,颜色,旋转等等(如果有必要的话)。你可以在网页中加入来引用该验证码,配合Session,就可以在用户登录时进行图形验证码认证。具体不详述,没什么难度。

如果对几个图像函数不熟悉,请自行查阅PHP手册。



参考资料:
End-user Documentation and API documentation of PEAR::Text_Password



相关阅读 更多 +
排行榜 更多 +
辰域智控app

辰域智控app

系统工具 下载
网医联盟app

网医联盟app

运动健身 下载
汇丰汇选App

汇丰汇选App

金融理财 下载