您的位置:首页 > 编程语言 > PHP开发

php摘要认证

2015-09-17 11:07 507 查看
 

根据<http权威指南>的描述,

A1=MD5(<user>:<realm>:<password>)

A2=MD5(<request-methd>:<uri-directive-value>)

最后结果:MD5(MD5(A1):<nonce>:<nc><cnonce>:<qop>:MD5(A2))

注意上面一行的MD5(A1)和MD5(A2)是有问题的,浏览器实现为MD5(A1:<nonce>:<nc><cnonce>:<qop>:A2)

<?php 

 $realm='saberyjs';

 $password='0011';//这个地方式要查询数据库的,只是为测试方便而已;

    if(!isset($_SERVER['PHP_AUTH_DIGEST']))

    {

        $nonce=uniqid();

        header("www-authenticate:Digest realm ='".$realm."',nonce='".$nonce."',algorithm='md5',qop='auth'");

        header("HTTP/1.0 401 Unauthorization Required");

        exit();

    }

   else 

   {

       //echo 'sset';

       //echo $_SERVER['PHP_AUTH_DIGEST'];

       $result=parse_auth_digest($_SERVER['PHP_AUTH_DIGEST']);

       //var_dump($result);

       //echo hexdec($result['nc']);

       //exit();

       if((int)$result['nc']>1)

       {

           //echo '随机数已经过期';

           $nonce=uniqid();

           header("www-authenticate:Digest realm ='".$realm."',nonce='".$nonce."',algorithm='md5',qop='auth'");

           header("HTTP/1.0 401 Unauthorization Required");

           exit();

           

       }

       $A1=md5($result['username'].":".$result['realm'].":".$password);

       //$A1=md5($result['username'].':'.$result['realm'].':'.$password).':'.$result['nonce'].':'.$result['cnonce'];

       $A2=md5($_SERVER['REQUEST_METHOD'].":".$result['uri']);

       $degest=md5($A1.":".$result['nonce'].':'.$result['nc'].':'.$result['cnonce'].':'.$result['qop'].':'.$A2);

      // var_dump($degest);

       if($degest!=$result['response'])

       {

           echo '验证失败';

           var_dump($result);

       }

       else 

       {

           echo '成功';

       }

   } 

   

   

   function parse_auth_digest($auth_digest)

   {

       $pairs=array();

       preg_match_all('/(\w+)=[\'"]?([\/a-z0-9A-Z.]+)[\'"]?/i',$auth_digest,$result,PREG_SET_ORDER);

       foreach($result as $value)

       $pairs[$value[1]]=$value[2];

       //var_dump($pairs);

       return $pairs;

   }

      

?> 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  php摘要认证 php