PHP安全编程之加密功能.doc_第1页
PHP安全编程之加密功能.doc_第2页
PHP安全编程之加密功能.doc_第3页
PHP安全编程之加密功能.doc_第4页
PHP安全编程之加密功能.doc_第5页
已阅读5页,还剩6页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

PHP安全编程之加密功能 银河技术在线整理时间:2002-10-3作者: 刘彦青 来源: 赛迪网 阅读:64 数据加密在我们生活中的地位已经越来越重要了,尤其是考虑到在网络上发生的大量交易和传输的大量数据。如果对于采用安全措施有兴趣的话,也一定会有兴趣了解PHP提供的一系列安全功能。在本篇文章中,我们将介绍这些功能,提供一些基本的用法,以便你能够为自己的应用软件中增加安全功能。预备知识在详细介绍PHP的安全功能之前,我们需要花点时间来向没有接触过这方面内容的读者介绍一些有关密码学的基本知识,如果对密码学的基本概念已经非常熟悉,就可以跳过去这一部分。密码学可以通俗地被描述为对加/解密的研究和实验,加密是将易懂的资料转换为不易懂资料的过程,解密则是将不易懂的资料转换为原来易懂资料的过程。不易懂的资料被称作密码,易懂的资料被称作明码。数据的加/解密都需要一定的算法,这些算法可以非常地简单,如著名的凯撒码,但当前的加密算法要相对复杂得多,其中一些利用现有的方法甚至是无法破译的。PHP的加密功能只要有一点使用非Windows平台经验的人可能对crypt()也相当熟悉,这一函数完成被称作单向加密的功能,它可以加密一些明码,但不能够将密码转换为原来的明码。尽管从表面上来看这似乎是一个没有什么用处的功能,但它的确被广泛用来保证系统密码的完整性。因为,单向加密的口令一旦落入第三方人的手里,由于不能被还原为明文,因此也没有什么大用处。在验证用户输入的口令时,用户的输入采用的也是单向算法,如果输入与存储的经加密后的口令相匹配,则输入的口信一定是正确的。PHP同样提供了使用其crypt()函数完成单向加密功能的可能性。我将在这里简要地介绍该函数: string crypt (string input_string , string salt) 其中的input_string参数是需要加密的字符串,第二个可选的salt是一个位字串,它能够影响加密的暗码,进一步地排除被称作预计算攻击的可能性。缺省情况下,PHP使用一个2个字符的DES干扰串,如果你的系统使用的是MD5(我将在以后介绍MD5算法),它会使用一个12个字符的干扰串。顺便说一下,可以通过执行下面的命令发现系统将要使用的干扰串的长度: print My system salt size is: . CRYPT_SALT_LENGTH;系统也可能支持其他的加密算法。crypt()支持四种算法,下面是它支持的算法和相应的salt参数的长度:算法 Salt长度 CRYPT_STD_DES 2-character (Default) CRYPT_EXT_DES 9-character CRYPT_MD5 12-character beginning with 102/td CRYPT_BLOWFISH 16-character beginning with 102/td 用crypt()实现用户身份验证作为crypt()函数的一个例子,考虑这样一种情况,你希望创建一段PHP脚本程序限制对一个目录的访问,只允许能够提供正确的用户名和口令的用户访问这一目录。我将把资料存储在我喜欢的数据库MySQL的一个表中。下面我们以创建这个被称作members的表开始我们的例子:mysqlCREATE TABLE members ( -username CHAR(14) NOT NULL, -password CHAR(32) NOT NULL, -PRIMARY KEY(username) -); 然后,我们假定下面的数据已经存储在该表中:用户名 密码 clark keloD1C377lKE bruce ba1T7vnz9AWgk peter paLUvRWsRLZ4U 这些加密的口令对应的明码分别是kent、banner和parker。注意一下每个口令的前二个字母,这是因为我使用了下面的代码,根据口令的前二个字母创建干扰串的:.= substr(, 0, 2);= crypt(, );/ 然后就和用户名一起存储在MySQL中 我将使用Apache的口令-应答认证配置提示用户输入用户名和口令,一个鲜为人知的有关PHP的信息是,它可以把Apache的口令-应答系统输入的用户名和口令识别为和,我将在身份验证脚本中用到这二个变量。花一些时间仔细阅读下面的脚本,多注意一下其中的解释,以便更好地理解下面的代码:crypt()和Apache的口令-应答验证系统的应用 上面就是一个核实用户访问权限的简单身份验证系统。在使用crypt()保护重要的机密资料时,记住在缺省状态下使用的crypt()并不是最安全的,只能用在对安全性要求较低的系统中,如果需要较高的安全性能,就需要我在本篇文章的后面介绍的算法。下面我将介绍另一个PHP支持的函数md5(),这一函数使用MD5散列算法,它有几种很有趣的用法值得一提:混编一个混编函数可以将一个可变长度的信息变换为具有固定长度被混编过的输出,也被称作“信息文摘”。这是十分有用的,因为一个固定长度的字符串可以用来检查文件的完整性和验证数字签名以及用户身份验证。由于它适合于PHP,PHP内置的md5()混编函数将把一个可变长度的信息转换为128位(32个字符)的信息文摘。混编的一个有趣的特点是不能通过分析混编后的信息得到原来的明码,因为混编后的结果与原来的明码内容没有依赖关系。 即便只改变一个字符串中的一个字符,也将使得MD5混编算法计算出二个截然不同的结果。我们首先来看下表的内容及其相应的结果:使用md5()混编字符串 结果:hash: 81ea092649ca32b5ba375e81d8f4972c注意,结果的长度为32个字符。再来看一下下面的表,其中的的值有了一点微小的变化:使用md5()对一个稍微变化的字符串进行混编 ?php/注意,message中少了一个s= This is some mesage that I just wrote;= md5();print hash2: ;? 结果:hash2: e86cf511bd5490d46d5cd61738c82c0c可以发现,尽管二个结果的长度都是32个字符,但明文中一点微小的变化使得结果发生了很大的变化,因此,混编和md5()函数是检查数据中微小变化的一个很好的工具。尽管crypt()和md5()各有用处,但二者在功能上都受到一定的限制。在下面的部分中,我们将介绍二个非常有用的被称作Mcrypt和Mhash的PHP扩展,将大大拓展PHP用户在加密方面的选择。尽管我们在上面的小节中说明了单向加密的重要性,但有时我们可能需要在加密后,再把密码数据还原成原来的数据,幸运的是,PHP通过Mcrypt扩展库的形式提供了这种可能性。McryptMcrypt 2.5.7Unix |Win32Mcrypt 2.4.7是一个功能强大的加密算法扩展库,它包括有22种算法,其中就包括下面的几种算法:Blowfish RC2 Safer-sk64 xteaCast-256 RC4 Safer-sk128DES RC4-iv SerpentEnigma Rijndael-128 ThreewayGost Rijndael-192 TripleDESLOKI97 Rijndael-256 TwofishPanamaSaferplus Wake安装:在标准的PHP软件包中不包括Mcrypt,因此需要下载它,下载的地址为:ftp:/argeas.cs-net.gr/pub/unix/mcrypt/。下载后,按照下面的方法进行编译,并把它扩充在PHP中:下载Mcrypt软件包。gunzipmcrypt-x.x.x.tar.gztar -xvfmcrypt-x.x.x.tar./configure -disable-posix-threadsmakemake installcd to your PHP directory./configure -with-mcrypt=dir -other-configuration-directivesmakemake install当然了,根据你的要求和PHP安装时与互联网服务器软件的关系,上面的过程可能需要作适当的修改。使用McryptMcrypt的优点不仅仅在于其提供的加密算法较多,还在于它可以对数据进行加/解密处理,此外,它还提供了35种处理数据用的函数。尽管对这些函数进行详细介绍已经超出了这篇文章的范围,我还是要就几个典型的函数作一下简要的介绍。首先,我将介绍如何使用Mcrypt扩展库对数据进行加密,然后再介绍如何使用它进行解密。下面的代码对这一过程进行了演示,首先是对数据进行加密,然后在浏览器上显示加密后的数据,并将加密后的数据还原为原来的字符串,将它显示在浏览器上。使用Mcrypt对数据进行加、解密?php/ Designate string to be encrypted= Applied Cryptography, by Bruce Schneier, isa wonderful cryptography reference.;/ Encryption/decryption keykey = Four score and twenty years ago;/ Encryption Algorithm= MCRYPT_RIJNDAEL_128;/ Create the initialization vector for added security.= mcrypt_create_iv(mcrypt_get_iv_size(,MCRYPT_MODE_ECB), MCRYPT_RAND);/ Output original stringprint Original string: ;/ Encrypt = mcrypt_encrypt(, key, MCRYPT_MODE_CBC, );/ Convert to hexadecimal and output to browserprint Encrypted string: .bin2hex().;= mcrypt_decrypt(, key, MCRYPT_MODE_CBC, );print Decrypted string: ;? 执行上面的脚本将会产生下面的输出:Original string: Applied Cryptography, by Bruce Schneier, is a wonderful cryptography reference.Encrypted string: 02a7c58b1ebd22a9523468694b091e60411cc4dea8652bb8072 34fa06bbfb20e71ecf525f29df58e28f3d9bf541f7ebcecf62b c89fde4d8e7ba1e6cc9ea24850478c11742f5cfa1d23fe22fe8 bfbab5eDecrypted string: Applied Cryptography, by Bruce Schneier, is a wonderful cryptography reference.上面的代码中二个最典型的函数是mcrypt_encrypt()和mcrypt_decrypt(),它们的用途是显而易见的。我使用了“电报密码本”模式,Mcrypt提供了几种加密方式,由于每种加密方式都有可以影响密码安全的特定字符,因此每种模式都需要了解。对于没有接触过密码系统的读者来说,可能对mcrypt_create_iv()函数更有兴趣,尽管对这一函数进行彻底的解释已经超出了本篇文章的范围,但我仍然会提到它创建的初始化向量(hence, iv),这一向量可以使每条信息彼此独立。尽管不是所有的模式都需要这一初始化变量,但如果在要求的模式中没有提供这一变量,PHP就会给出警告信息。Mhash扩展库/projects/mhash/0.8.3版的Mhash扩展库支持12种混编算法,仔细检查Mhash v.0.8.3的头文件mhash.h可以知道,它支持下面的混编算法:CRC32 HAVAL160 MD5CRC32B HAVAL192 RIPEMD160GOST HAVAL224 SHA1HAVAL128 HAVAL256 TIGER安装象Mcrypt一样,Mhash也没有包括在PHP软件包中,对于非Windows用户而言,下面是安装过程:下载Mhash扩展库gunzipmhash-x.x.x.tar.gztar -xvfmhash-x.x.x.tar./configuremakemake installcd ./configure -with-mhash=dir -other-configuration-directivesmakemake install象Mcrypt一样,根据PHP在互联网服务器软件上的安装方式,可能需要对Mhash进行其他的配置。对于Windows用户而言,http:/www.php4win.de中有一个很好的包括Mhash扩展库在内的PHP软件包。只要下载并进行解压缩,然后根据其中的readme.first文档中的指令进行安装即可。使用Mhash对信息进行混编非常简单,看一下下面的例子: 执行这一段脚本程序将得到下面的输出结果:The hashed message is 07a92a4db3a4177f19ec9034ae5400eb60d1a9fbb4ade461 在这里使用bin2hex()函数的目的是方便我们理解的输出,这是

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论