admin 管理员组

文章数量: 1086019


2024年4月25日发(作者:novelkeys官网)

维普资讯

计算机时代2002年第1期 ・】7・ 

沈新根 

(中国建设银行新江省海盐支行314300) 

1引言 

”2db76afceSc0I 7662770fc2360cclcd4”! 

”648al9754f7803769c66f87Ib9cA17Ia”! 

当你看到上面的两行字符串的时候,肯定会感到很奇 

怪,这是什么意思?当然.我并不要你理解这两行字符串 

的意思,固为通过加密的方法臆藏了真正的信息 

随着计算机应用的推广,对数据加密的要求也越来越 

高.特别是因为在网络上传送的数据是采用明文的方式, 

所“如何保证在数据传输的过程中不被监听或拦截,将变 

得非常的重要 现在越来越多的网站采用PHP来开发网 

站,本文将介绍如伺通过PHP的加解密功能来增强网站应 

用的安全性。 

2预备知识 

在讲解PHP的功能前先介绍一些关于密码学的由容, 

如果你已经了解一些密码学的基本内容.请跳过本节。 

消息(message)被称为明文(plaintext)。用某种方法 

曲装消息以隐藏它的内容的过程称为加密(cnctTption), 

而被加密的数据称为密文(cjphertext)i把密文转变为明 

文的过程称为解密(dectyption) 

密码编码学一般认为是使消息保密的技术和科学 数 

据可 通过一些算法进行加密和解密,这些算法可以是非 

常的简单、例如Caeser密码就是通过把每一个明文字符移 

动N位的方法来实现加密。当然,现在有些算法相当的复 

杂,甚至可以认为用目前已知的方法是不能破解的。 

3 PHP的加密功能 

也许有些使用过非Windows平台的人非常熟悉cry p1 

0函数。这个函数可 用来对一些明文进行单向加密,但 

是它不能把加密过的密文还原成原来的明文 从表面上看 

来这个方法没有什么用处.但是 在确保系统密码完整的 

领域它被广泛地应用。如果一个被单向加密过的密文落^ 

第三方手中,对于他们来说没有多大的意义,因为他们不 

能从这个密文中获得明文。当需要验证用户输入的密码时, 

把用户的输入通过单向加密后与系统保存的密文进行比 

较,如果相同,那么输入的密码就是正确的 

PHP也提供了它自己的单向加密函数crypt()。 

string crypt(siring inpuLsiring【.string salt]) 

上面是crypt()的函数声明,参数ioputstring是休想 

要加密的字符串;第二十可选参数salt可以使产生的密码 

降低预计算攻击的威胁 政省地.PHP使用两个字的DES 

啦【t宇串。但是,如果你的系统刚好使用的是基于MD5 

(在后面将会介绍MD5算法)的密码学.那么PHP使用I2 

个字的sa)t的字串。你可Ⅵ利用以下的脚本知道系统的salt 

字串的大小: 

print”咐syslem salt size ls:”CRYPT SALT

LENGTH; 

可能你的系统支持别的加密算法,crypt 0总共支持 

四种算法,表】列出相关的算法使用的salt宇串的大小 

4使用crypt 0进行用乒认证 

找们可 使用crypt 0函数作一个例子,很设你想要 

通过PHP脚本限制某个目录只允许拥有正确的账号和密码 

的用户访问。我使用MySQL来存储数据(可以使l啊 

pbpmyadmin来管理Mysq1)。首先创建一个表(表名为 

“mcmb ̄s” 。 

mysqI>CREATE TABLE members c 

>username CHAR(14)NOT NULL 

>password CHAR(32)NOT NULL. 

>PRIMARY KEY(username) 

)). 

接着、在r丌embers表中加入下列记录: 

Username Password 

C rk ketoU1C377tKE 

B ruo ̄ Be1T7vnz9Awgk 

Peler paLUvRWsRLZ4U 

字段Passw0rd的值是经过加密的.分别对应的是 

“kent”,“banner”和“parker” 注意到它们的前两个字符 

维普资讯

18・ Computer era No.1 2002 

分别和未加密的字串的前两个字符相同。 

这是因为使用下面的代码来生成密码的基于前两十字 

母的salt: 

¥sair substr csenteredPassword.0.2): 

//¥enteredPassword是输八的明文密码 

SuserPswd crypt(SenteredPassword.¥sa ). 

//¥userPsv,d是存^mysql的密码 

利用Apache的challenge._csp0nse授权方案来提示用 

户输入账号和密码。在PHP中可以使用Apache的challenge— 

rcsp0nse把输入的账号和密码分别作为全局变量¥PHP_ 

AulrH uSER和¥PHP_AUTH PW 请阅读下面的脚本: 

脚本I:使用crypt 0和Apache的challenge-response 

授权方案。 

(,php 

¥hosl=”localbost”: 

¥user=。 ̄orro"; 

¥pswd=“hetlodolty’’: 

¥db= users 

设置为耒敢证 

¥authoriz ̄ation;O 

枉验输八的账号和密码 

if(isset(¥PH口_AuTH_USE R)&&isset{¥PHP』UTH— 

P )f 

mysql ̄oconnect(Shoat.¥user.¥psw1)or die( 'Can。t 

corlrlectto MySQL 

se rver!’ , 

mysqlselect

__

db(Sdb)ordie( Can。t selectdatabase!”), 

“进行加毫 

¥salt=substr{¥PHP-AuTH_P 0.2): 

¥enc _pgwd=cwpt(¥PHP—AuTH—P ¥salt); 

建立查询 

¥query=。"SELECT usemame FROM members WHERE 

usemame=’¥PHP AUTH USER’AND 

password='¥enclypted psvKI。。’ 

执行查询 

if{rrrysqI

_

numfows(mysqI_query(¥query))==1)( 

¥authorization=1: 

) 

) 

//礴矗 盘 

if{!Saulhorization)f 

header(。wVW Authenticate:Basic erahTl=“Private'”), 

header f HTTP,1 0 401 Unauthorized'); 

Drlnt’'You are unauthorized to ecter this area“ 

exit; 

) 

else f 

print。q-his is the secret data!“. 

) 

,> 

这样你就拥有了一个简单的认证方案 

接下来,介绍PHP支持的另外一十函数rod5()。这个 

函数使用MD5散列算法。 

5散列法 

散列(hash)函数把可变长度的消息转换成固定长度 

的输出串(叫做散列值),这也可以称为 消息摘要”。这 

个函数非常有用,它可以用来检查文件的完整性和检验数 

字签名,另外还可以作为用户认证。PHP内值的rod5(J 

散列函数可以把任意长的消息转换128位的消息摘要。应 

该注意的是因为经过转换的消息摘要已经和原来的明文没 

有任何的关系,所以不可能通过消息摘要破译消息。为了 

说明这点,下面的例子通过改变一个字串的一十字符,使 

MD5散列算法计算出两十差别很大的消息摘要。首先我 

们来看看脚本2和它的输出 

脚本2:A string hashedwithrod5 0。 

(,php 

¥msg;”This is solme message that I Just wrote“. 

Senc_msg=rod5(¥msg 

print“hash:¥enc_msg 

,> 

输出结果 

hash 81ea092649ca32b5ba3 5e81dSf4972c 

注意到输出得结果是32个字符 现在来看看脚本3. 

我们对¥msg的值作一些细微的改变: 

脚本3 A slightly modiifed string hashed with ord5()。 

(,php 

把。message 去掉一十一S 

¥msg=。q'hls ec ̄lle mesage that I just wfa 

Senc

_

msg=rod5{¥msg). 

print“hash2:¥enc msg<br/><br,) : 

,> 

The oufcome: 

hssh2:e86cf511bd5490d46d5cd61738c82c0c 

正如体所看到的,虽然输出的结果都是32个字符.但 

是输出串却完全不同 因此散列法和rod5 0函数被广泛 

地应用于检查数据中的细微变化。 

虽然crypt 0和rod5 0都有它们各自的用处.但是 

他们在功能上也都有相当的限制。 

6关于PHP和密码学需要注意的 

关于PHP和密码学需要注意的是当数据在服务器和客 

户端之间传输的时候,数据是不安全的。PHP是一个服务 

器端的技术.它并不能在传输的过程中阻止网络刺探者的 

攻击。因此,如果你想做一个完全的安全应用.建议使用 

Apache-SSL等其它有名的安全服务器。 


本文标签: 加密 消息 密码 函数 使用