本文总结自: https://www.cnblogs.com/huey/p/5490759.html
浏览器与服务端之间可以通过cookie进行身份验证,那么,桌面应用程序与服务端呢?
BASIC认证(基本认证)
当客户端向服务端进行数据请求时,如果客户端尚未被认证,则http服务器将使用基本认证对客户端的用户名密码进行认证,以确认用户是否合法,一般方法为 将 用户名:密码 用base64加密后放入请求头中的Authorization,再发送给服务器,此方式为基本认证。
基本认证也能用于浏览器端,但相对较少。
基本认证过程:
1.http请求头中添加Authorization: Basic + base64加密字段
2.验证通过,返回内容;验证不通过,返回头中的WWW-Authenticate中会有相关说明
备注: 基本认证使用base64编码,安全性低容易解码,因此一般使用HTTPS传输,相对安全性会高一些。
Digest认证(摘要认证)
http1.1中提出的用以替代基本认证的方案
1.密码不再明文传递,而是用摘要来代替,一般使用MD5加密(基本不可逆,除非太简单)生成,服务端只存储摘要与客户端发来的摘要对比。
2.防止重放攻击,服务端向客户端发送随机数nonce,客户端生成摘要时得把nonce放在密码上,服务端知道用户的原始密码及nonce,接收到请求后再临时生成摘要与之对比
3. 通过客户端产生随机数cnonce的方式,支持客户端对服务器的认证。
4.通过对内容也加入摘要计算的方式,可有选择的防止对报文内容的篡改。
摘要认证过程:
1.服务端接受客户端请求,生成随机数nonce,放在响应头WWW-Authenticate,状态码为401 Unauthorized
2.客户端发现是401,弹出让用户输入用户名密码的认证窗口,用户输入后生成摘要,放入请求头中的Authorization,
如果此时客户端也要对服务端进行认证,可生成并发送客户端随机数cnonce
3.服务端基于用户原始密码及nonce重新生成摘要与客户端发来的摘要对比,如果客户端反过来用客户端随机数对服务器进行质询,就会创建客户端摘要。
服务器可以预先将下一个随机数计算出来,提前将其传递给客户端,这样下一次客户端就可以预先发送正确的摘要了。