admin 管理员组

文章数量: 1184232


2024年4月23日发(作者:什么是c语言整型常量)

维普资讯

L■ 

■ 

■ 

囊 

一 

文/竹叶青 

数据加密在我们生活中的地位已经越来越重蔓了,尤其是 作为crypt()函数的一个例子,考虑这样一种情况,你 

希望创建一段PHP脚本程序限制对一个目录的访问,只允许 

_ 

■ 

■ 

考虑到在网络上发生的大量交易和传输的大量数据。如果对采用 

安全措施有兴趣的话.也一定会有兴趣了解PHP提供的一系列安 

全功能 在本篇文章中,我们将介绍这些功能,提供一些基本的 

能够提供正确的用户名和口令的用户访问这一目录.我将把 

资料存储在我喜欢的数据库 s札的—个表中.下面我们以 

创建这个被称作members的表开始我们的例子: 

mysql>CF¥cATE TABLE m目由ers( 

)us豇n岫e CIGAR(14)NOI吼 L 

用法,以便你能够为自己的应用软件中增加安全功能。 

P的加密功能 

■ 

只要有一点使用非 indo霄s平台经验的人可能对cr ̄tO 

>password口t^R(32) Hu上. 

也相当熟悉,这一函数完成被称作单向加密的功能,它可 

以加密一些明码,但不自巨够将密码转换为原来的明码。尽管 

从表面上来看这似乎是一个没有什么用处的功能,但它的确 

)m 

)): 

m err ̄e) 

■ 

然后,我们假定下面的数据已经存储在该表中: 

用户名密码 

clark keloDICg771比 

bn e bB1订Ynz。^ 

peter瑚 州 舒删 

被广泛用来保证系统密码的完整性。因为,单向加密的口令 

旦落入第三方人的手里,由于不能被还原为明文,因此也 

没有什么太用处。在验证用户输入的口令时,用户的输入 

采用的也是单向算法,如果输入与存储的经加密后的口令相 

匹配,则输入的口信一定是正确的。 

PHP同样提供了使用其crypt 0函数完成单向加密功能的 

可能性。我将在这里简要地介绍该函数: 

mh Ⅱ t‘e” ng i t

这些加密的口令对应的明码分别是kent、banner和 

p ̄rker。注意一下每个口令的前二个字母,这是因为我使用了 

下面的代码,根据口令的前二个字母剖建干扰串的z 

¥ent edP s_ 

r1ng L.stri ̄“t】) I鼢h=s曲 T嫱明 婵 g柏rd.啦 : 

其中的inputstring参数是需要加密的字符串,第二个 

luserPs州=crYPt(SentBredPass ̄rd,l 1 : 

可选的salt是一个位字串,它自巨够影响加密的暗码,进一 

步地排除被称作预计算攻击的可能性。缺省情况下,PHP使 

用一个2个字符的DES干扰串,如果你的系统使用的是MD5 

i'/SuserPm,d熬后就和用户名—。起存储在埘s皿中 

我将使用Apache的口令应答认证配置提示用户输入用 

户名和口令,一个鲜为人知的有关P肝的信息是,它可以把 

Apa c h e 的口令一应菩系统输入的用户名和口令识别为 

¥P咿

(我将在以后介绍帅5算法),它会使用一个12个字符的干扰 

串。顺便说一下,可以通过执行下面的命令发现系统将要使用 

的干扰串的长度: 

print №system salt size is: cRwr SALT LE硎: 

_I脚汛和¥PHP一删 秘将在身份验证脚本中用 

到这二个变量。花一些时间仔细阅读下面的脚奉,多注意一 

下其中的解释.以便更好地理解下面的代码: 

crmtO ̄Al ̄cha的口々一应普验证幕境的应用 

<?p 

系统也可能支持其他的加密算法 crypt 0支持四种算 

法,下面是它支持的算法和相应的S al t参数的长度; 

算法Salt长度 

CM

Shost= localhost : 

Suser= z0rT : 

¥p8 : heu odon . 

S曲= uses : 

STI)DES 2-chex ̄cter(Default) 

OPiF ̄EX ̄DES 9_chBl ter 

Y 

C 

5 1}char日ct beginming with¥15 

日 IsH 16-chsr ̄ter beginning lith¥25 

Set叫ul izati讲L to False 

Sautborizati ̄=O: 

用crypt 0实现用户身份验证 

Veri奸that has tered岫 口鼬・ 曲刊 

维普资讯

if(issec({I ALrrH Us嘞Ⅱisset(¥m )): 

print1 :¥er ̄_mg 

) 

sql-pc锄ect h。st.¥岫er, s 叮die( Can’t connect tol s 

 ̄iwer! ): 

mysql

select db(¥db)OF die('Can t select datal:ese! ): 

_

结果: 

//Perform the encrypti ̄ 

囊 t 栩Ibstr( 咿J【mLJ 0,2); 

注意,结果的长度为32个字符・再来 下下面的表 

轴眦眦.d—pg-d=crypt(车】刊 舢11j—P Ssalt). 

//Build the queF ̄ 

very=-sⅡE【=_I us 一

l】s B =’SP} AuTH

一 

其中的¥msg的值有了一点微小的变纯- 

使用rod50对—叶.稍铮璺 _七的字符串进行瀹编 

F n ̄bers㈣ 

(?php 

。栅 

,,注意,Ⅲess姆中少了一十s 

g  ̄This is∞ that I just_rote : 

d=’SencrT;ted ̄swd一 

//Execute the query 

if(mysql

nu ̄ows{mysql quay0口u盯y))一1)‘ 

_

Se ̄c_mg=md5(1 

, 

print }msll2:;etlc

msg<br/Xhr,) 

> 

th lzati0n:1 

endif

. 

结果: 

hasn2:胡6cfSl1bd5删46d50d61738o82cOc 

endif: 

//cmfirm Butborization 

可以发现,尽管二个结果的长度都是32十字符.但 

明文中一点微小的变化使得结果发生了很太的变化,因此, 

混编和md50函数是检查数据中微小变化的—个很好的工具。 

尽管crypt0和rod50备有用处,但二者在功能上都受到 

if(!Saut ̄ori z io : 

heB ̄Br(。 Authpnticate:Basic realm ̄ Private ), 

heB ̄er(。I{ITP/1 0 401 Unauthorized ), 

print You 

ex1t 

e mauthori zed tO enter this are& 

定的限制。在下面的部分中,我们将介绍二十非常有用的 

else: 

被称作k ̄rpt和 ̄hasyh的PHP扩展,将太太拓展PHP用户在加 

密方面的选择。 

尽管我们在上面的小节中说明了单向加密的重要性,但 

后 

 ̄'int ]his 1 s ble secret血cB! 

endif: 

?> 

上面就是一个核实用户访问权限的简单身份验证系统。 

在使用crypt 0保护重要的机密资料时,记住在缺省状态下使 

用的cryptO ̄是最安全的,只能用在对安全性要求较低的 

硅 M,t 

幸运的是,PHP通过№rypt扩 艮库的形式提供了竭荆l司桃

 ̄rypt 2.5.7 Unix【Win32 

。 

系统中,如果需要较高的安全性能,就需要我在本文的后面介 

绍的算法。 

下面我将介绍另一个PHP支持的函 ̄--md5 0,这一 

Mcrypt 2.4.7是—个 它包 

括有22种算法,其中就包括下面的几种算法: 

Bl< ̄ffish RC2 Safergk64 xtea 

函数使用WI)5散列算法,它有几种很有趣的用法值得一提; 

棍编 

Cast 256 RC4 Safe ̄skl28 

D臣RC4iv SerD帆t 

个混编函数可以将一个可变长度的信息变换为具有固 

Eai ̄a Rijndael一128 rnreeway 

Gost Rijndael—l啦!riDle咂s 

LOKI97 Rijndael 2 ̄Twofish 

 ̄ferplus Wake 

定长度被混编过的输出,也被称作 信息文摘 。这是十 

分有用的,因为一个固定长度的字符串可以用来检查文件的 

完整性和验证数字箍名以及用户身份验证。由于它适合于 

咖P,咖P内置的md50混编函数将把一个可变长度的信息转 

使用 t 

换为1 28位(32个字符)的信息文摘。混编的—个有趣的 

特点是不能通过分析混编后的信息得到原来的明码,因为混 

Mcrypt的优点不仅仅在于其提供的加密算法较多,还在 

于它可以对数据进行加/解密处理,J比 卜’它还提供了35种 

娃理数据用的函数。尽管对这些函数进行详细舟绍已经超出 

了这篇文章的范囝,我还是要就几个典型的函数作一下简要的 

介绍。 

编后的结果与原来的明码内容投有依赖关系。即便只改变一 

个字符串中的一个字符,也将使得帕5泥编算法计算出二个截 

然不同的结果。我们首先来看下表的内容及其相应的结果: 

使用md50混编字符串 

< }】p 

Smsg= Tni㈣is『∞ss ethat I Jllst 01 

首先,我将介绍如何使用Mcrypt扩展库对数据进行加 

密,然后再介绍如何使用它进行解密。下面的f哨对这一过 

程进行了演示,首先是对数据进行加密,然后在测览器上显 

示加密后的数据,并将加密后 

¥ ̄nc 

msg 

= 

ord5 

( 

_

维普资讯

■I●一■●■■■■ 

将它显示在浏览器上。 

使用Mcrypt对数据进行加、解密 

//D日Bi目咀te string to be L 肚ed 

}lAV^Ll2B Ij^¨L256 T1 

使用■Ⅻ 

对信息进行混缠非常俯单・看一 下面 I倒子・ 

< 

Sstri ̄= AI ̄pli酣Cryptngre ̄y, 

自 ̄nderful口7m0 

№Scbaeier,is 

¥h曲

一 

g=圳^s}【_TIG瓯: 

the directi ̄to the日 l麒fort 1■o 

,refea-mlce ̄ . 

s蜘8e= Th皓Ⅲ

//h口7pti0n,曲口 i00 key 

Skey="Four score andt ̄nty yearsngo": 

ste口slefttⅡ ee s rishtt cha 

cllad  :

黾; 

’’’ 

//EncxTption Algorithm 

¥ciphe ̄jlg= 

Shashe4

mes. ̄e= ̄mh(¥has口一日1g.善晴昭sa胂). 

_

一 

RIJ№m

 :

print 

ity 

?> 

hnsb ̄咐e醴窖e is b 硼删 神): 

//☆ea the initializezin v ̄tor fnr added 

¥iv=mcrypt_creete—iv(mcrypt ̄et iv size(¥c1p}ler alg, 

唧 0吨

执行这一段脚本程序将得到下面的输出结果- 

}日tled s is 

髓).-既YPT_R㈣: 

// t呻t。rigiTIa1 string 

print Original string 

//Enerypt Sstring 

知 ∞ 一str T =mcr ̄t

encrypt(¥ciPher

alg,{ n 

__

trinB<p) . 

在这里使用hin2hex()函数的目的是方便我们理解 

Shashed

message的输出,这是因 

_

式,为了能够将它转化为易于理解的格式,必须将它转换 

为十六进制格式。 

¥strins,-口m

-l。DE

一 

¥iv), 

//Cenvla ̄to he.decimal md output to bro ̄ser 

pl'i ̄*l ̄cryoted ̄rig:■binn2bex(¥et】cr坤t 

stri . (p> . 

需要注意的是.混编是单向功能,其结果不依艘输入, 

因此可以公开显示这—信息。这一策略通常用于让用户比瞍下 

¥decr 一str 增=哪

t_decr t(¥cip}ler alg.¥key. 

¥e鼬r,pted

stri . 盯 m咂

c 

{1计. 

载文件和系统管理员提供的文件.以确保文件的完整性。 

 ̄dhash还有其他一些有用的函数。倒如,我需要输出 

 

ripnt Decrypted s ̄rig:¥decr ̄ted

string".

?> 

个№ash支持的算法的名字.由于岫蹦 支持的所有算法 

的名字都以MHASH

开头.因此,可以通过执行如下的代码 

执行上面的脚本将会产生下面的输出: 

Original string:Applied 

O埘∞f c哪0 印h ref盯en曲. 

p 哪 Bruce Sc] ̄eier.i s a 

完成这一任务 

<?php 

¥be ̄b_al¥=Ⅻ删JI ; 

ripnt r}lis抽tB has be朗hashed tb the ̄. 

heshine a1 

№cr,pted string lied CrYptograPhy.by Bruce Schneier.is a 

) 

i”l 

mnd ̄-ful cryotngr ̄hy referet】ce. 

得到的输出是: 

上面自年代码中二个最典型的函数是mcrypt

enc ̄rpt()和 

 ̄czTpt—dec ̄t0.它们的用途是显而易见的。我使用了“电 

Thi s data has be∞hashed withthe TD∞}m i  ̄em-itm 

关于PHP和加密最后需要注意的一个问题 

关于P咿和加密需要注意的最后的—个重要问题是在服 

务器和客户端之问传输的数据在传输过程中是不安全的! 

PHP是一种服务器端技术,不能阻止数据在传输过程中泄 

密。因此,如果想实现一个完整的安全应用.建议选用 

Apache—SSL或其他的安全服务器布置。 

报密码本 模式,Mcrypt提供了几种加密方式,由于每种加 

密方式都有可以影响密码安全的特定字符,因此每种模式都 

需要了解。对于没有接触过密码系统的读者来说.可能对 

mcrypt

create

_

_

iv()函数更有兴趣,尽管对这一函数进行舰雇 

的解释已经超出了本篇文章的范围,但我仍然会提到它创建的 

初始化向量(hence。 iv).这一向量可以使每条信息彼此独 

立。尽管不是所有的模式都需要这一初始化变量,但如果在要 

求的模式中投有提供这一变量.PHP就会给出警告信息。 

■ i1l扩展库 

仔细检查mash v,n 8.3的头文件Ⅱ止laslL h可以知道,它 

支持下面的棍编算法: 

a 

H 

 

160帅5 

182 I{IPl ̄l印 

不论在仅了这讨用篇这论于文篇数章了文据最P章盱加后介密内.绍置的我了功一需P的能要咿c强指r最y大出有pt的用()扩是的展和,功庠—m能d一十之5(真—)加 正—密r安—y函p全羲t数和的据,她P加H还aP密S讨l应1,。 蓑荔黧雾≥} 霪雾璧蕤  爱耄荨萎 

用 由于PHP是一种瑕务器端的技 

术,因此,在数据由客户端向服务器螭进行传输时,它不能 

I ̄AVAI224 SSA1 

保证数据的安全。■ 


本文标签: 加密 函数 数据 口令 用户