• WebApi接口安全认证——HTTP之摘要认证


      摘要访问认证是一种协议规定的Web服务器用来同网页浏览器进行认证信息协商的方法。它在密码发出前,先对其应用哈希函数,这相对于HTTP基本认证发送明文而言,更安全。从技术上讲,摘要认证是使用随机数来阻止进行密码分析的MD5加密哈希函数应用。它使用HTTP协议。

    一、摘要认证基本流程:

    1.客户端请求 (无认证)

    Html代码

    GET /dir/index.html HTTP/1.0  
    Host: localhost

    2.服务器响应
    服务端返回401未验证的状态,并且返回WWW-Authenticate信息,包含了验证方式Digest,realm,qop,nonce,opaque的值。其中:
    Digest:认证方式;
    realm:领域,领域参数是强制的,在所有的盘问中都必须有,它的目的是鉴别SIP消息中的机密,在SIP实际应用中,它通常设置为SIP代理服务器所负责的域名;
    qop:保护的质量,这个参数规定服务器支持哪种保护方案,客户端可以从列表中选择一个。值 “auth”表示只进行身份查验, “auth-int”表示进行查验外,还有一些完整性保护。需要看更详细的描述,请参阅RFC2617;
    nonce:为一串随机值,在下面的请求中会一直使用到,当过了存活期后服务端将刷新生成一个新的nonce值;
    opaque:一个不透明的(不让外人知道其意义)数据字符串,在盘问中发送给用户。

    Html代码

    HTTP/1.0 401 Unauthorized  
    Server: HTTPd/0.9  
    Date: Sun, 10 Apr 2005 20:26:47 GMT  
    WWW-Authenticate: Digest realm="testrealm@host.com",  
                            qop="auth,auth-int",  
                            nonce="dcd98b7102dd2f0e8b11d0f600bfb0c093",  
                            opaque="5ccc069c403ebaf9f0171e9517f40e41"

    3.客户端请求 (用户名 "Mufasa", 密码 "Circle Of Life")
    客户端接受到请求返回后,进行HASH运算,返回Authorization参数
    其中:realm,nonce,qop由服务器产生;
    uri:客户端想要访问的URI;
    nc:“现时”计数器,这是一个16进制的数值,即客户端发送出请求的数量(包括当前这个请求),这些请求都使用了当前请求中这个“现时”值。例如,对一个给定的“现时”值,在响应的第一个请求中,客户端将发送“nc=00000001”。这个指示值的目的,是让服务器保持这个计数器的一个副本,以便检测重复的请求。如果这个相同的值看到了两次,则这个请求是重复的;
    cnonce:这是一个不透明的字符串值,由客户端提供,并且客户端和服务器都会使用,以避免用明文文本。这使得双方都可以查验对方的身份,并对消息的完整性提供一些保护;
    response:这是由用户代理软件计算出的一个字符串,以证明用户知道口令。

    Html代码

    response计算过程:
    HA1=MD5(A1)=MD5(username:realm:password)  
    如果 qop 值为“auth”或未指定,那么 HA2 为  
    HA2=MD5(A2)=MD5(method:digestURI)  
    如果 qop 值为“auth-int”,那么 HA2 为  
    HA2=MD5(A2)=MD5(method:digestURI:MD5(entityBody))  
    如果 qop 值为“auth”或“auth-int”,那么如下计算 response:  
    response=MD5(HA1:nonce:nonceCount:clientNonce:qop:HA2)  
    如果 qop 未指定,那么如下计算 response:  
    response=MD5(HA1:nonce:HA2)  

    请求头:

    Html代码

    GET /dir/index.html HTTP/1.0  
    Host: localhost  
    Authorization: Digest username="Mufasa",  
                         realm="testrealm@host.com",  
                         nonce="dcd98b7102dd2f0e8b11d0f600bfb0c093",  
                         uri="/dir/index.html",  
                         qop=auth,  
                         nc=00000001,  
                         cnonce="0a4f113b",  
                         response="6629fae49393a05397450978507c4ef1",  
                         opaque="5ccc069c403ebaf9f0171e9517f40e41"  

    4.服务器响应
    当服务器接收到摘要响应,也要重新计算响应中各参数的值,并利用客户端提供的参数值,和服务器上存储的口令,进行比对。如果计算结果与收到的客户响应值是相同的,则客户已证明它知道口令,因而客户的身份验证通过。

    Html代码

    HTTP/1.0 200 OK  

    二、服务端验证

    编写一个自定义消息处理器

  • 相关阅读:
    C#中调用DTS
    经典问题:向setTimeout传递函数参数
    C#.NET 中的类型转换
    SQL语句导入导出大全 (转载)
    js脚本defer的作用
    [转]使用 Java API 处理 WebSphere MQ 大消息
    WideCharToMultiByte 宽字节转换为多字节
    [原].NET数据库开发中请注意区域时间格式
    输出页眉和页脚的简单HTTP模块实践
    浅析ASP.NET HTTP Module
  • 原文地址:https://www.cnblogs.com/rinack/p/7754981.html
Copyright © 2020-2023  润新知