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

原创 2005年04月26日 16:34:00

文件来源: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,就可以在用户登录时进行图形
验证码认证。具体不详述,没什么难度。

VB 如何实现随机图形验证码

  • 2009年09月30日 21:01
  • 945B
  • 下载

【代码实现】PHP生成各种随机验证码

文章来源:PHP开发学习门户 地址:http://www.phpthinking.com/archives/531 验证码在WEB应用中非常重要,通常用来防止用户恶意提交表单,如恶意注册和...

php + redis 完成api接口的图形验证码

php + redis 完成api接口的图形验证码1.生成产生图形验证码的url$mobile = $_GET['mobile']; $captcha = new SimpleCaptcha(arra...

php复习 第九天 绘制图形验证码

ps:不知为何,博主很喜欢正则和绘制这种东西。 使用的话,把$stringText的值取出即可~...

PHP5生成图形验证码(有汉字)

利用PHP5中GD库生成图形验证码 类似于下面这样 1.利用GD库函数生成图片,并在图片上写指定字符      imagecreatetruecolor   新建一个真彩色图像      imag...

PHP 图形图像操作(生成图像验证码、添加水印等)

注意:如果有同学在本地环境使用代码输出后,没有图片,一是查看下php.ini里gd库是否开启,前面注释;去掉。如果还是不显示,只出现一个小小的正方形。在代码前面加ob_clean(); PHP图形操作...

完整的PHP图形验证码程序源码

首先是PHP代码:
  • ShunYea
  • ShunYea
  • 2012年12月27日 15:17
  • 439

PHP生成随机验证码

  • 2017年11月09日 22:46
  • 330KB
  • 下载

php登录验证(包括用户名、密码、验证码、数据库、是否已登陆验证、自动登录和注销登录)

登录界面 具体实现方法如下: login.html Title " alt="验证码"> 换一个 ...
  • C_jian
  • C_jian
  • 2016年10月19日 15:43
  • 1125
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:(转)PHP PEAR中用Text_Password轻松实现随机密码以及图形验证码
举报原因:
原因补充:

(最多只允许输入30个字)