首页 > 语言 > 关键词  > php教程最新资讯  > 正文

PHP中的加密功能

2008-09-05 12:00 · 稿源:互联网
数据加密在我们生活中的地位已经越来越重要了,尤其是考虑到在网络上发生的大量交易和传输的大量数据。如果对于采用安全措施有兴趣的话,也一定会有兴趣了解PHP提供的一系列安全功能。在本篇文章中,我们将介绍这些功能,提供一些基本的用法,以便你能够为自己的应用软件中增加安全功能。

预备知识
在详细介绍PHP的安全功能之前,我们需要花点时间来向没有接触过这方面内容的读者介绍一些有关密码学的基本知识,如果对密码学的基本概念已经非常熟悉,就可以跳过去这一部分。

密码学可以通俗地被描述为对加/解密的研究和实验,加密是将易懂的资料转换为不易懂资料的过程,解密则是将不易懂的资料转换为原来易懂资料的过程。不易懂的资料被称作密码,易懂的资料被称作明码。

数据的加/解密都需要一定的算法,这些算法可以非常地简单,如著名的凯撒码,但当前的加密算法要相对复杂得多,其中一些利用现有的方法甚至是无法破译的。

PHP的加密功能
只要有一点使用非Windows平台经验的人可能对crypt()也相当熟悉,这一函数完成被称作单向加密的功能,它可以加密一些明码,但不能够将密码转换为原来的明码。尽管从表面上来看这似乎是一个没有什么用处的功能,但它的确被广泛用来保证系统密码的完整性。因为,单向加密的口令一旦落入第三方人的手里,由于不能被还原为明文,因此也没有什么大用处。在验证用户输入的口令时,用户的输入采用的也是单向算法,如果输入与存储的经加密后的口令相匹配,则输入的口信一定是正确的。

PHP同样提供了使用其crypt()函数完成单向加密功能的可能性。我将在这里简要地介绍该函数:

stringcrypt(stringinput_string[,stringsalt])
其中的input_string参数是需要加密的字符串,第二个可选的salt是一个位字串,它能够影响加密的暗码,进一步地排除被称作预计算攻击的可能性。缺省情况下,PHP使用一个2个字符的DES干扰串,如果你的系统使用的是MD5(我将在以后介绍MD5算法),它会使用一个12个字符的干扰串。顺便说一下,可以通过执行下面的命令发现系统将要使用的干扰串的长度:

print"Mysystemsaltsizeis:".CRYPT_SALT_LENGTH;
系统也可能支持其他的加密算法。crypt()支持四种算法,下面是它支持的算法和相应的salt参数的长度:

算法Salt长度
CRYPT_STD_DES2-character(Default)
CRYPT_EXT_DES9-character
CRYPT_MD512-characterbeginningwith$1$
CRYPT_BLOWFISH16-characterbeginningwith$2$

用crypt()实现用户身份验证
作为crypt()函数的一个例子,考虑这样一种情况,你希望创建一段PHP脚本程序限制对一个目录的访问,只允许能够提供正确的用户名和口令的用户访问这一目录。我将把资料存储在我喜欢的数据库MySQL的一个表中。下面我们以创建这个被称作members的表开始我们的例子:

mysql>CREATETABLEmembers(
->usernameCHAR(14)NOTNULL,
->passwordCHAR(32)NOTNULL,
->PRIMARYKEY(username)
->);

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

用户名密码
clarkkeloD1C377lKE
bruceba1T7vnz9AWgk
peterpaLUvRWsRLZ4U

这些加密的口令对应的明码分别是kent、banner和parker。注意一下每个口令的前二个字母,这是因为我使用了下面的代码,根据口令的前二个字母创建干扰串的:

$enteredPassword.
$salt=substr($enteredPassword,0,2);
$userPswd=crypt($enteredPassword,$salt);
//$userPswd然后就和用户名一起存储在MySQL中

我将使用Apache的口令-应答认证配置提示用户输入用户名和口令,一个鲜为人知的有关PHP的信息是,它可以把Apache的口令-应答系统输入的用户名和口令识别为$PHP_AUTH_USER和$PHP_AUTH_PW,我将在身份验证脚本中用到这二个变量。花一些时间仔细阅读下面的脚本,多注意一下其中的解释,以便更好地理解下面的代码:

crypt()和Apache的口令-应答验证系统的应用
<?php

$host="localhost";
$user="zorro";
$pswd="hellodolly";
$db="users";

//SetauthorizationtoFalse

$authorization=0;

//Verifythatuserhasenteredusernameandpassword

if(isset($PHP_AUTH_USER)&&isset($PHP_AUTH_PW)):

mysql_pconnect($host,$user,$pswd)ordie("Can’tconnecttoMySQL
server!");

mysql_select_db($db)ordie("Can’tselectdatabase!");

//Performtheencryption
$salt=substr($PHP_AUTH_PW,0,2);
$encrypted_pswd=crypt($PHP_AUTH_PW,$salt);

//Buildthequery

$query="SELECTusernameFROMmembersWHERE
username=’$PHP_AUTH_USER’AND
password=’$encrypted_pswd’";

//Executethequery

if(mysql_numrows(mysql_query($query))==1):
$authorization=1;
endif;

endif;

//confirmauthorization

if(!$authorization):

header(’WWW-Authenticate:Basicrealm="Private"’);
header(’HTTP/1.0401Unauthorized’);
print"Youareunauthorizedtoenterthisarea.";
exit;

else:

print"Thisisthesecretdata!";

endif;

?>

上面就是一个核实用户访问权限的简单身份验证系统。在使用crypt()保护重要的机密资料时,记住在缺省状态下使用的crypt()并不是最安全的,只能用在对安全性要求较低的系统中,如果需要较高的安全性能,就需要我在本篇文章的后面介绍的算法。

下面我将介绍另一个PHP支持的函数━━md5(),这一函数使用MD5散列算法,它有几种很有趣的用法值得一提:

混编
一个混编函数可以将一个可变长度的信息变换为具有固定长度被混编过的输出,也被称作“信息文摘”。这是十分有用的,因为一个固定长度的字符串可以用来检查文件的完整性和验证数字签名以及用户身份验证。由于它适合于PHP,PHP内置的md5()混编函数将把一个可变长度的信息转换为128位(32个字符)的信息文摘。混编的一个有趣的特点是不能通过分析混编后的信息得到原来的明码,因为混编后的结果与原来的明码内容没有依赖关系。即便只改变一个字符串中的一个字符,也将使得MD5混编算法计算出二个截然不同的结果。

举报

  • 相关推荐
  • 选奶必看:opo 在奶粉中的功效和作用大揭秘

    文章介绍了OPO结构脂在婴幼儿奶粉中的重要作用。OPO是一种接近母 乳脂肪结构的成分,能减少钙皂形成,改善宝宝便秘问题,促进钙质吸收和骨骼发育,同时增强肠道菌群平衡和免疫力。相比普通奶粉的POP结构,OPO更易消化吸收。佳贝艾特悦护羊奶粉不仅含有4.2g/100g的高含量OPO,其羊奶小分子结构吸收率高达95%,还添加10倍类HMO成分,临床验证可提升保护因子IgG达62%,全方位�

  • 网友住酒店光脚洗澡感染HPV 医生回应:需注意防护

    ​近日,“酒店光脚洗澡可能感染HPV”这一话题在网络上迅速发酵,引发了公众对公共场所卫生安全问题的广泛关注和热烈讨论。据媒体报道以及医学专家分析,在酒店等公共浴室光脚洗澡,确实存在感染跖疣病毒的风险,而该病毒正是一种低危型HPV病毒。 跖疣,这一由人乳头瘤病毒(HPV)引发的足部良性增生物,其感染多发生在温暖潮湿的环境中。医学专家指出,当足部皮

  • iPhone迎来历史性转变:苹果iOS 26首次开放通话/信息等核心功能

    据媒体报道,苹果已推出新的应用程序接口(API),允许用户在第三方应用中拨打蜂窝电话以及收发短信、彩信、RCS消息,这一功能仅向欧盟地区的iPhone用户开放。 在此之前,用户只能使用苹果自带的电话和信息应用才能体验这些最基础的运营商功能,因此iOS 26的这项变动意义重大,苹果开放应用接口很可能是为了符合欧盟《数字市场法案》的监管要求。 苹果表示,欧盟地�

  • 梦回iPhone 7时代!iPhone 17 Air电池曝光:2800mAh

    快科技7月19日消息,iPhone 17 Air电池容量仅2800mAh,比2016年iPhone 7 Plus的2900mAh还小,主要因机身厚度仅5.5mm成为苹果最薄机型。为弥补续航,苹果配备自研C1基带芯片降低功耗,并计划推出MagSafe外接电池配件。配置方面采用120Hz直屏、A19处理器、12GB内存、4800万单摄,预装iOS 26。值得注意的是,超薄设计使其仅支持eSIM技术,取消了物理SIM卡槽。

  • A日报:Kimi开放平台上线Kimi Playground;OpenAI重磅发布ChatGPT Agent;Suno推人声替换功能

    【AI日报】汇总了近期AI领域重要进展:1)月之暗面推出Kimi Playground平台,实现从对话助手到智能助理的转变;2)OpenAI发布ChatGPT Agent,支持自主执行浏览、购物等任务;3)Suno发布v4.5+版本,新增人声替换等音乐创作功能;4)谷歌Veo3视频生成模型上线,支持文本转视频;5)全球首个直播流扩散模型MirageLSD发布,实现实时视频转换;6)VSCode编程助手Traycer提升大型代码库处理效率;7)ART框架支持Python一键训练AI Agent;8)NVIDIA语音识别模型Canary-Qwen-2.5B词错率创新低;9)Mistral AI推出Le Chat挑战ChatGPT;10)百度小度上线首个支持物理交互的MCP Server;11)Lightricks的LTXV模型实现60秒高质量视频生成;12)开源模型LTX-Video13B支持30倍速高清视频生成。

  • iPhone 17 Pro/Pro Max大曝光:比16 Pro多了一款配色

    随着iPhone 17系列发布时间的临近,有关这款新品的细节陆续被曝光。 最新爆料显示,iPhone 17 Pro、iPhone 17 Pro Max共有5款配色,比iPhone 16 Pro系列多了一款。 具体来说,iPhone 17 Pro系列提供黑色、灰色、银色、深蓝色和橙色五种配色,而iPhone 16 Pro系列提供沙漠色、原色、白色和黑色,从爆料来看,iPhone 17 Pro系列配色中最具辨识度的是深蓝色。

  • 苹果iPhone 17 Pro系列四配色渲染图出炉:史上首款橙色登场

    据majinbuofficial爆料,结合配件厂商和知情人士的消息,确认今年iPhone 17 Pro系列降提供四款配色可选,与前代保持一致。 具体配色是黑色、深蓝色、银色、橙色,其中橙色是iPhone Pro系列有史以来第一次使用。 爆料对四款配色的描述如下: 黑色:经典且优雅,类似此前型号中的黑色钛金属,但采用磨砂处理,增加优雅感并减少指纹可见度。 深蓝色:一种深到几乎夜幕般的色�

  • 苹果搞定量产问题!iPhone 17 Pro将首发屏幕抗刮抗反射涂层

    据MacRumors最新报道,苹果公司已解决屏幕抗刮抗反射涂层的生产问题,有望率先应用在iPhone 17 Pro和iPhonePro Max上。 据悉,苹果去年就曾有这个计划,但是后来量产工艺遇到问题,一度被传取消该计划。 当时消息称,为iPhone显示屏添加防反射涂层的过程太慢了,达不到苹果巨大的量产需求。 如今,苹果已经联合供应商改进了工艺,解决了量产问题,iPhone 17 Pro系列可以实现规�

  • iPhone 17系列重回铝合金中框:仅iPhone 17 Air保留钛合金

    据知名分析师Jeff Pu介绍,苹果将在iPhone 17系列重回铝合金中框,只有iPhone 17 Air保留钛合金中框。 苹果在2017年的iPhone X上首次开始使用不锈钢,并且在Pro机型上延续到iPhone 14 Pro,而后又在iPhone 15 Pro开始使用钛合金。 如今看来,钛合金成为苹果最快抛弃的材质。 iPhone 17 Air选择钛合金中框也是迫不得已,因为该机厚度在6mm以内,而钛合金的强度、硬度、韧性、抗拉强度、抗伸

  • 苹果首款折叠屏iPhone参数曝光:首发自研C2基带

    近日,瑞银分析师透露了苹果公司即将推出的折叠屏iPhone的详细参数规格,引发市场广泛关注。据介绍,这款备受期待的折叠屏iPhone将搭载全新的A20Pro芯片,并首次采用苹果自研的基带芯片C2,标志着苹果在芯片自主研发领域迈出了重要一步。 在存储配置方面,折叠屏iPhone将提供12GB内存,以及256GB、512GB和1TB三种存储容量选择,满足不同用户的需求。屏幕方面,该机内屏尺寸�