首页 园地图库文章列表留言下载
现在位置:首页 -> 网络科技 -> 编程相关
MD5算法的PHP实现
作者:站长 来源:秘密园地 更新日期:2005-8-6 阅读次数
文字 〖 自动滚屏(右键暂停)

PHP Manual 
--------------------------------------------------------------------------------
md5
(PHP 3, PHP 4 , PHP 5)
md5 -- Calculate the md5 hash of a string
Description
string md5 ( string str [, bool raw_output])
Calculates the MD5 hash of str using the RSA Data Security, Inc. MD5 Message-Digest Algorithm, and returns that hash. The hash is a 32-character hexadecimal number. If the optional raw_output is set to TRUE, then the md5 digest is instead returned in raw binary format with a length of 16. 
注: The optional raw_output parameter was added in PHP 5.0.0 and defaults to FALSE 
例子 1. A md5() example
<?php
$str = ’apple’;
if (md5($str) === ’1f3870be274f6c49b3e31a0c6728957f’) {
    echo "Would you like a green or red apple?";
    exit;
}
?>
See also crc32(), md5_file(), and sha1(). 
PHP中的MD5加密  
日期:2005-05-23 10:00:08   来源:不详   作者:未知   总浏览:290 
收藏到我摘  收藏到网络文摘  收藏到和讯网摘  收藏到365KEY  收藏到YOUNOTE  收藏到bbmao  
综述:密码学是研究编制密码(我们简称为加密:encode)和破译密码(我们称之为解密:decode)的技术科学。研究密码变化的客观规律,应用于编制密码以保守通信秘密的,称为编码学;应用于破译密码以获取通信情报的,称为破译学,总称密码学。通常情况下,人们将可懂的文本称为明文;将明文变换成的不可懂的文本称为密文。把明文变换成密文的过程叫加密;其逆过程,即把密文变换成明文的过程叫解密。 
PHP中提供了哪些数据加密功能? 
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)中:
 mysql>CREATE TABLE 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的口令-应答验证系统的应用 
 <?php 
$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()混编字符串 
 <php 
$input = "Hello,PHP world!"; 
$output = md5($input); 
print "输出: $output "; 
?>  
结果: 
输出: 7996b5e0804042fd531907a4900f190e 
注意,结果的长度为32个字符。我们把$input的值稍微改变一下: 
使用md5()对一个稍微变化的字符串进行混编 
 <?php 
$input = "Hello,PHP World!"; 
$output = md5($input); 
print "输出: $output "; 
?>  
结果: 
hash2: f0456d48ed06a5c35b1e42561fa7a016 
可以发现,尽管二个结果的长度都是32个字符,但明文中一点微小的变化使得结果发生了很大的变化,我们可以利用这个特点来检查数据中微小变化。 
 
上篇文章: MD5加密算法 ASP实现
下篇文章:七夕礼物
相关文章:
  • 关于MD5站长自述
  • 用 md5 生成校验和
  • 请问有md5的反函数吗?
  • 用 MD5 加密数据库中的用户密码
  • 使用MD5加密数据库中的用户密码(一)
  • 使用MD5加密数据库中的用户密码(二)
  • java的md5加密类(zt)
  • MD5的Java Bean实现
  • 修改MD5加密 提高网站安全
  • MD5加密算法DELPHI实现
  • MD5算法的汇编语言实现部分代码
  • CSDN中MD5加解密总结
  • MD5算法的JAVA实现
  • ASP.NET中使用MD5和SHA1算法加密
  • MD5算法的C#实现
  • MD5加密算法 ASP实现
  • MD5算法的T-SQL实现(FOR SQL2000)2
  • MD5算法的T-SQL实现(FOR SQL2000)1
  • MD5算法在JS中的实现
  • 用C语言实现MD5算法
  • 版权所有:文摘园地;本站资料均由站长收集,如果有侵权,请立即来信留言告诉我们,以免损害您的权益,谢谢!
    Copyright © 2004 文摘园地 http://wwww.mmkey.com All Rights Reserved Power by:HeadWind
    粤ICP备05098767号