Chinaunix首页 | 论坛 | 博客
  • 博客访问: 17911444
  • 博文数量: 7460
  • 博客积分: 10434
  • 博客等级: 上将
  • 技术积分: 78178
  • 用 户 组: 普通用户
  • 注册时间: 2008-03-02 22:54
文章分类

全部博文(7460)

文章存档

2011年(1)

2009年(669)

2008年(6790)

分类:

2008-05-27 21:57:02

 

关于随机密码

 

系统自动生成随机密码或口令,这是WEB程序常见的功能之一。例如这样的注册模式你一定不会感到陌生:当用户注册时,系统为用户生成一个随机密码并发至其注册邮箱。用户登录自己的邮箱得到系统所给的随机密码后,再登录系统修改为自己想要的密码。这和直接发送密码到用户邮箱相比,避免了用户密码在网络上的明文传输,大大增强了系统安全性。随机密码还常用于“忘记密码”功能,用户忘记密码后,系统可以为之自动再生成一个密码。

 

 

/*随机字符串的生成还有一个很酷的应用就是验证码,PEAR中有一个对应的类库Text_CAPTCHA。目前Text_CAPTCHA还只是Alpha版本,所以我们暂不讨论,等到Stable版本释出后我会向大家介绍。Text_CAPTCHA就基于即将介绍的Text_Password开发的。本文中也将会有一个图形验证码的实例,采用Text_Password+GD开发。*/

 

我们在WEB开发中生成的密码都是由数字,字母和特殊字符组成的。根据不同的组合方式,密码的类型可以大概分成纯数字型,纯字母型,纯特殊字符型,数字字母混合型,数字字母特殊字符混合型等。

 

PEAR::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

阅读(816) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~