搜索php.ini将参数打开:
short_open_tag = On
设置为如上即可,On表示打开。
php md5加密的另类应用,供大家学习参考。
变换一:循环MD5
对一个密码进行多次的MD5运算。
自定义一个函数,它接受$data和$times两个形参,第一个是要加密的密码,第二个是重复加密的次数。
实现这种变换有两种算法。
//迭代算法
function md5_1_1($data, $times = 32)
{
//循环使用MD5
for ($i = 0; $i < $times; $i++) {
$data = md5($data);
}
return $data;
}
//递归算法
function md5_1_2($data, $times = 32)
{
if ($times > 0) {
$data = md5($data);
$times--;
return md5_1_2($data, $times); //实现递归
} else {
return $data;
}
}
?>
变换二:密文分割MD5
//把密文分割成两段,每段16个字符
function md5_2_1($data)
{
//先把密码加密成长度为32字符的密文
$data = md5($data);
//把密码分割成两段
$left = substr($data, 0, 16);
$right = substr($data, 16, 16);
//分别加密后再合并
$data = md5($left).md5($right);
//最后把长字串再加密一次,成为32字符密文
return md5($data);
}
//把密文分割成32段,每段1个字符
function md5_2_2($data)
{
$data = md5($data);
//循环地截取密文中的每个字符并进行加密、连接
for ($i = 0; $i < 32; $i++) {
$data .= md5($data{$i});
}
//这时$data长度为1024个字符,再进行一次MD5运算
return md5($data);
}
?>
变换三:附加字符串干涉
//附加字符串在原数据的尾部
function md5_3_1($data, $append)
{
return md5($data.$append);
}
//附加字符串在原数据的头部
function md5_3_2($data, $append)
{
return md5($append.$data);
}
//附加字符串在原数据的头尾
function md5_3_3($data, $append)
{
return md5($append.$data.$append);
}
?>
变换四:大小写变换干涉
由于PHP所提供的md5()函数返回的密文中的英文字母全部都是小写的,因此我们可以把它们全部转为大写,然后再进行一次MD5运算。
function md5_4($data)
{
//先得到密码的密文
$data = md5($data);
//再把密文中的英文母全部转为大写
$data = strtotime($data);
//最后再进行一次MD5运算并返回
return md5($data);
}
?>
变换五:字符串次序干涉
把MD5运算后的密文字符串的顺序调转后,再进行一次MD5运算。
function md5_5($data)
{
//得到数据的密文
$data = md5($data);
//再把密文字符串的字符顺序调转
$data = strrev($data);
//最后再进行一次MD5运算并返回
return md5($data);
}
?>
用好php md5()函数,在用户信息加密上多作些功夫,可以减少更多的安全风险。
PHP crypt()函数可以完成基本的加密功能:
string crypt (string input_string [, string salt])
这一函数完成被称作单向加密的功能,也就是说,它可以加密一些明码,但不能够将密码转换为原来的明码。单向加密的口令一旦落入第三方人的手里,由于不能被还原为明文,因此也没有什么大用处。在验证用户输入的口令时,用户的输入采用的也是单向算法,如果输入与存储的经加密后的口令相匹配,则输入的口令一定是正确的。
这个函数的input_string参数是需要加密的字符串,第二个参数salt是一个位字串,它能够影响加密的暗码,进一步地排除被称作预计算攻击的可能性。缺省情况下,PHP使用一个2个字符的DES干扰串,如果你的系统使用的是MD5 ,它会使用一个12个字符的干扰串。我们可以通过执行下面的命令发现系统将要使用的干扰串的长度:
print "系统使用的干扰串的长度是:". CRYPT_SALT_LENGTH;
crypt()支持四种算法,下面是它支持的算法和相应的salt参数的长度:
[注:以下用表格]
算法 Salt长度
CRYPT_STD_DES 2-character (默认)
CRYPT_EXT_DES 9-character
CRYPT_MD5 12-character beginning with $1$
CRYPT_BLOWFISH 16-character beginning with $2$
如何将PHP的数据加密功能应用于用户验证?
我们用crypt()实现用户身份验证。比如我们用一段PHP程序限制对一个目录的访问,只允许注册用户访问这一目录。我们把资料存储MySQL数据库的一个表(这个数据表名为members)中:
->username CHAR(14) NOT NULL,
->password CHAR(32) NOT NULL,
->PRIMARY KEY(username)
->);
然后,我们可以输入用户的数据到该表中:
用户名 密码
Tom keloD1C377lKE
John ba1T7vnz9AWgk
Bill paLUvRWsRLZ4U
这些加密的口令对应的明码分别是Tom、John和Bill。我们将根据口令的前二个字母创建干扰串:
$enteredPassword.
$salt = substr($enteredPassword, 0, 2);
$userPswd = crypt($enteredPassword, $salt);
// $userPswd然后就和用户名一起存储在MySQL 中
crypt()和Apache的口令-应答验证系统的应用
$host = "localhost"; //主机
$username = "Tom"; //用户名
$passwd = "Hello world"; //密码
$db = "users"; //数据库名
// 设置是否通过验证标志,默认为否
$authorization = 0;
// 提示用户输入帐号和密码
if (isset()($PHP_AUTH_USER) && isset($PHP_AUTH_PW)){
mysql_pconnect()($host, $username, $passwd) or die("不能连接到MySQL服务器!");
mysql_select_db($db) or die("不能选择数据库!");
// 进行加密
$salt = substr($PHP_AUTH_PW, 0, 2);
$encrypted_pswd = crypt($PHP_AUTH_PW, $salt);
//SQL查询语句
$query = "SELECT username FROM members WHERE username = \'$PHP_AUTH_USER\' AND password = \'$encrypted_pswd\'";
// 执行查询
if (mysql_numrows(mysql_query()($query)) == 1) {
$authorization = 1;
}
}
if (! $authorization){
header(\'WWW-Authenticate: Basic realm="用户验证"\');
header(\'HTTP/1.0 401 Unauthorized\');
print "无法通过验证";
exit;
}else {
print "已经加密";
}
?>
在缺省状态下使用的 crypt()并不是最安全的,所以如果需要较高的安全性能,就需要其他更好的算法,比如md5(),这一函数使用MD5散列算法。
如何通过MD5方式进行加密?
PHP中通过MD5方式加密的函数有md5(),它的一个作用是混编。
一个混编函数可以将一个可变长度的信息变换为具有固定长度被混编过的输出,也被称作"信息文摘",这是十分有用的,因为 一个固定长度的字符串可以用来检查文件的完整性和验证数字签名与用户身份。PHP内置的md5()混编函数将把一个可变长度的信息转换为128位(32个字符)的信息文摘。混编的一个有趣的特点是:不能通过分析混编后的信息得到原来的明码,因为混编后的结果 与原来的明码内容没有依赖关系。即便只改变一个字符串中的一个字符,也将使得MD5混编算法计算出二个截然不同的结果。我们首先来看下表的内容及其相应的结果:
使用md5()混编字符串
$input = "Hello,PHP world!";
$output = md5($input);
print "输出: $output ";
?>
结果:
输出: 7996b5e0804042fd531907a4900f190e
注意,结果的长度为32个字符。我们把$input的值稍微改变一下:
使用md5()对一个稍微变化的字符串进行混编
$input = "Hello,PHP World!";
$output = md5($input);
print "输出: $output ";
?>
结果:
hash2: f0456d48ed06a5c35b1e42561fa7a016
可以发现,尽管二个结果的长度都是32个字符,但明文中一点微小的变化使得结果发生了很大的变化,我们可以利用这个特点来检查数据中微小变化。