了解crypt()
只要有一点使用非Windows平台经验的读者都可能对crypt()相当熟悉,这一函数完成被称作单向加密的功能,它可以加密一些明码,但不能反过来将密码重新转换为原来的明码。crypt()函数定义如下。
string crypt (string input_string [, string salt])
其中,input_string参数是需要加密的明文字符串,第二个可选的salt是一个位字串,能够影响加密的暗码,进一步排除被破解的可能性。缺省情况下,PHP使用一个2个字符的DES干扰串,如果系统使用的是MD5(参考下一节内容),PHP则会使用一个12个字符的干扰串。可以通过执行下面的命令发现系统将要使用的干扰串的长度。
print "My system salt size is: ". CRYPT_SALT_LENGTH;
crypt()支持4种加密算法,表19.1显示了其支持的算法和相应的salt参数的长度。
表crypt()支持四种加密算法
算法 | Salt长度 |
CRYPT_STD_DES | 2-character (Default) |
CRYPT_EXT_DES | 9-character |
CRYPT_MD5 | 12-character beginning with $1$ |
CRYPT_BLOWFISH | 16-character beginning with $2$ |
复制代码 代码如下:
$user_name=$_POST["user_name"];
require_once("sys_conf.inc"); //系统配置文件,包含数据库配置信息
//连接数据库
$link_id=mysql_connect($DBHOST,$DBUSER,$DBPWD);
mysql_select_db($DBNAME); //选择数据库my_chat
//查询是否存在登录用户信息
$str="select name,password from user where name ='$user_name'";
$result=mysql_query($str,$link_id); //执行查询
@$rows=mysql_num_rows($result); //取得查询结果的记录笔数
$user_name=$_SESSION["user_name"];
$password=$_POST["password"];
$salt = substr($password, 0, 2);
$password_en=crypt($password,$salt); //使用crypt()对用户密码进行加密
//对于老用户
if($rows!=0)
{
list($name,$pwd)=mysql_fetch_row($result);
//如果密码输入正确
if($pwd==$password_en)
{
$str="update user set is_online =1 where name ='$user_name' and password='$password_en'";
$result=mysql_query($str, $link_id);//执行查询
require("main.php"); //转到聊天页面
}
//密码输入错误
else
{
require("relogin.php");
}
}
//对于新用户,将其信息写入数据库
else
{
$str="insert into user (name,password,is_online) values('$user_ name','$password_en',1)";
$result=mysql_query($str, $link_id); //执行查询
require("main.php"); //转到聊天页面
}
//关闭数据库
mysql_close($link_id);
?>