PHP中MD5加密函数的使用方法与实例
先从最基础的概念说起。密码学,其实就是研究如何对信息进行隐藏(加密)以及如何还原隐藏信息(解密)的一门技术。它主要分为两大方向:一是“编码学”,专注于设计难以破解的密码系统,确保通信内容的机密性;二是“破译学”,致力于破解这些密码,从加密信息中获取情报。通常,我们将可读的原始信息称为“明文”,而加密
先从最基础的概念说起。密码学,其实就是研究如何对信息进行隐藏(加密)以及如何还原隐藏信息(解密)的一门技术。它主要分为两大方向:一是“编码学”,专注于设计难以破解的密码系统,确保通信内容的机密性;二是“破译学”,致力于破解这些密码,从加密信息中获取情报。通常,我们将可读的原始信息称为“明文”,而加密后的乱码称为“密文”。从明文到密文的过程称为加密,反之,从密文还原为明文的过程称为解密。
那么问题来了:在PHP这个具体的开发环境中,我们可以使用哪些加密手段?
PHP提供了一个核心加密函数——crypt()。它的调用方式为:string crypt(string input_string [, string salt])。该函数实现了一个非常重要的特性:单向加密。这意味着,你可以将一段明文加密,但几乎不可能将加密后的密文还原为原始明文。这有什么实际用途?假设用户的口令以密文形式存储在数据库中,即使数据库被拖库,攻击者拿到那串加密字符串,也无法直接得知原始密码。验证时,系统会将用户输入的密码用同样的算法重新加密,然后对比两个密文是否一致;如果一致,则密码正确。
函数中的第二个参数salt(干扰串)非常关键。它是一个位字符串,能够影响最终的加密结果,有效防止“预计算攻击”(例如彩虹表)。默认情况下,PHP使用一个2字符的DES干扰串;如果你的环境支持MD5,则会使用12字符的干扰串。想知道当前系统支持什么长度?直接打印查看:print "系统使用的干扰串的长度是:". CRYPT_SALT_LENGTH;。
crypt()支持四种加密算法,每种算法对应的salt长度各不相同:
(原文表格:算法 CRYPT_STD_DES,Salt长度 2-character,默认)
(原文表格:算法 CRYPT_EXT_DES,Salt长度 9-character)
(原文表格:算法 CRYPT_MD5,Salt长度 12-character beginning with $1$)
(原文表格:算法 CRYPT_BLOWFISH,Salt长度 16-character beginning with $2$)
如何使用crypt()实现用户验证?
一个很常见的场景:限制某个目录的访问,只有注册用户才能进入。我们可以将所有用户信息存储在MySQL的一个表中,表名为members:
mysql> CREATE TABLE members (
-> username CHAR(14) NOT NULL,
-> password CHAR(32) NOT NULL,
-> PRIMARY KEY(username)
-> );
然后录入一些用户数据,例如:Tom、John、Bill,对应的加密密文分别为keloD1C377lKE、ba1T7vnz9AWgk、paLUvRWsRLZ4U。
加密时,我们从用户输入的密码中截取前两个字符作为salt:
$enteredPassword.
$salt = substr($enteredPassword, 0, 2);
$userPswd = crypt($enteredPassword, $salt);
// $userPswd然后就和用户名一起存储在MySQL中
下面是完整的示例,演示如何配合Apache的HTTP基础验证(Basic Authentication)实现登录拦截:
需要警惕的是,crypt()在默认情况下使用的算法并不是最安全的。如果你对安全性有更高的要求,就必须考虑更健壮的算法,比如MD5。这就是为什么我们接下来要介绍md5()函数。
如何通过MD5方式进行加密?
PHP中通过MD5方式加密的函数是md5(),它执行的操作称为“混编”(也叫哈希或摘要)。混编函数能够将一个可变长度的输入信息,转换为一个固定长度的输出——这个输出被称为“信息文摘”。固定长度的特性使其用途广泛:检查文件完整性、验证数字签名,以及用户身份验证。混编最有趣的地方在于:你无法从文摘反推出原始信息,因为两者之间没有依赖关系。更关键的是,哪怕输入只改变一个字符,最终的MD5结果也会变得天差地别。
看一个例子:
结果:输出: 7996b5e0804042fd531907a4900f190e,长度为32个字符。
我们只将world的w改为大写W:
结果立刻变为:hash2: f0456d48ed06a5c35b1e42561fa7a016。注意,结果长度依然是32个字符,但内容完全不同。这种高度敏感的变化特性,恰好可以用来检测数据中任何细微的篡改。

