最近在调试一款门禁产品,门禁产品使用的digest 认证

摘要认证的关键是加密算法过程,客户端根据服务器返回的信息+自己的用户名和密码信息,进行本地加密,然后发送加密后的摘要信息到服务器,服务器根据用户传递的信息进行验证,验证通过则代表有权限

访问过程如下

(1)对于需要认证的HTTP交互,客户端在提交HTTP请求后,服务端会返回401 Unauthorized的应答,

 并且头部包含WWW-Authenticate项,表示客户端需要提供认证信息. HTTP头部的WWW-Authenticate项示例如下.

WWW-Authenticate: Digest realm="webserver", domain="::", qop="auth", nonce="ZmFkODI1Y2ZmZTQwYTM3MDJhZTRmMWI1ZWE5NTRiZWY6d2Vic2VydmVyOjVkZDQwODg3OjExNw==", opaque="5ccc069c403ebaf9f0171e9517f40e41", algorithm="MD5", stale="FALSE"

(2)客服端根据返回的header数据进行本地加密

string realm = "webserver";
string nonce = "ZmFkODI1Y2ZmZTQwYTM3MDJhZTRmMWI1ZWE5NTRiZWY6d2Vic2VydmVyOjVkZDQwODg3OjExOQ==";
string uri = "digest/frmDstPara";
string nonceCount = "00000002";
string clientNonce = "...";
string response = "";
string HA1 = MD5Str("admin:" + realm + ":asdfghjkl123").tolower();
string HA2 = MD5Str("POST:" + uri).tolower();
string s2= String.Format("{0}:{1}:{2}:{3}:{4}:{5}", HA1, nonce, nonceCount, clientNonce, "auth", HA2);
response = MD5Str(s2).tolower(); ;

其中需要注意的是HA1 和HA2和 respoinse一定要转换为小写,否则对于标准的digest 认证可能通过不了

这里的clientNonce 为客户端生成的nonce值

而nonceCount 用于统计,假设开始时为00000001,下次请求后就变成了00000002,不一定每次都加1,但是后面请求中的nc值肯定大于前一次请求中的nc值。

(3)提交请求,服务器会在header里查找 Authorization 并进行和客户端一样的加密过程,对比response是否一致,一致的话,则返回200

在header 里添加 Authorization 

Authorization: Digest username="admin", realm="webserver", nonce="ZmFkODI1Y2ZmZTQwYTM3MDJhZTRmMWI1ZWE5NTRiZWY6d2Vic2VydmVyOjVkZDQwODg3OjExOQ==", uri="digest/frmDstPara", response="f84a841fef42be86c925b346324eba77", opaque="5ccc069c403ebaf9f0171e9517f40e41", qop=auth, nc=00000002, cnonce="dff275c9dd027985"