<?php
// Digest=MD5(MD5(A1):<nonce>:<nc>:<cnonce>:<qop>:MD5(A2))
// A1=<user>:<realm>:<password>
// A2=<request-method>:<uri-directive-value>
// Digest qop="auth", realm="DS-GWAS0101(6233)", nonce="4e4449354e4451794f5451364e6a4a6c4e47517a4e6a673d", stale="FALSE"
// Digest username="admin", realm="DS-GWAS0101(6233)", nonce="4e4449354e4451794f5451364e6a4a6c4e47517a4e6a673d", uri="/ISAPI/Security/userCheck?format=json&timeStamp=1659163271665", response="5524a7f41c8938862f982801cbde6044", qop=auth, nc=00000001, cnonce="d24caff90e7b4910"
$sign=makeDigest();
echo $sign;
function makeDigest($method='',$uri='',$headerDigest=''){
// 测试数据
$method='GET';
$uri='/ISAPI/Security/userCheck?format=json';
$headerDigest='Digest qop="auth", realm="DS-GWAS0101(6233)", nonce="4d44466b4d5441785a4445364e6a4a6c4e4759345a6d453d", stale="TRUE"';
function getRandStr($length){
$str = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789';
$randstr = '';
for ($i=0;$i<$length;$i++) {$num=rand(0,strlen($str)-1);$randstr .= $str[$num];}
return $randstr;
}
$pattern='/(\w+)="?([\w\d\-\(\)\.\*\/\+]+)"?/';
preg_match_all($pattern, $headerDigest, $arr);
$header_arr=[];
if (count($arr)) {
foreach ($arr[0] as $k => $v) {
$key=$arr[1][$k];
$value=$arr[2][$k];
$header_arr[$key]=$value;
}
}
$signParams=[
'cnonce'=>getRandStr(16),
'nc'=>rand(10000000,99999999),
];
$signArr=[
'user'=>'admin',
'realm'=>$header_arr['realm'],
'password'=>'Lysoo889900',
'request_method'=>$method,
'uri_directive_value'=>$uri,
'nonce'=>$header_arr['nonce'],
'nc'=>$signParams['nc'],
'cnonce'=>$signParams['cnonce'],
'qop'=>$header_arr['qop'],
];
$A1="{$signArr['user']}:{$signArr['realm']}:{$signArr['password']}";
$A2="{$signArr['request_method']}:{$signArr['uri_directive_value']}";
$str=md5($A1).":{$signArr['nonce']}:{$signArr['nc']}:{$signArr['cnonce']}:{$signArr['qop']}:".md5($A2);
$response=md5($str);
$Digest='Digest username="'.$signArr['user'].'", realm="'.$signArr['realm'].'", nonce="'.$signArr['nonce'].'", uri="'.$signArr['uri_directive_value'].'", response="'.$response.'", qop='.$signArr['qop'].', nc='.$signArr['nc'].', cnonce="'.$signArr['cnonce'].'"';
return $Digest;
}