zoukankan      html  css  js  c++  java
  • #HTTP协议学习# (三)摘要认证

    转自:http://www.cnblogs.com/youxilua/archive/2013/06/15/3137236.html

     

    这个认证可以看做是基本认证的增强版本,使用随机数+密码进行md5,防止通过直接的分析密码MD5防止破解. 摘要访问认证最初由 RFC 2069 (HTTP的一个扩展:摘要访问认证)中被定义加密步骤:

    1. ha1

    2. ha2 

    3. res

    后来发现,就算这样还是不安全(md5 可以用彩虹表进行攻击),所以在RFC 2617入了一系列安全增强的选项;“保护质量”(qop)、随机数计数器由客户端增加、以及客户生成的随机数。这些增强为了防止如选择明文攻击的密码分析。

    d1

    1. 如果 qop 值为“auth”或未指定,那么 HA2 为

      d3

    2. 如果 qop 值为“auth-int”,那么 HA2 为

      d3

    3. 如果 qop 值为“auth”或“auth-int”,那么如下计算 response:

      d4

    4. 如果 qop 未指定,那么如下计算 response:

      d5

    好了,知道加密步骤,下面我们用文字来描述一下;

    最后,我们的response 由三步计算所得. 1. 对用户名、认证域(realm)以及密码的合并值计算 MD5 哈希值,结果称为 HA1。

    HA1 = MD5( "tom:Hi!:123456" ) = d8ae91c6c50fabdac442ef8d6a68ae8c

    1. 对HTTP方法以及URI的摘要的合并值计算 MD5 哈希值,例如,"GET" 和 "/index.html",结果称为 HA2。

      HA2 = MD5( "GET:/" ) = 71998c64aea37ae77020c49c00f73fa8

    2. 最后生成的响应码

      Response = MD5("d8ae91c6c50fabdac442ef8d6a68ae8c:L4qfzASytyQJAC2B1Lvy2llPpj9R8Jd3:00000001:c2dc5b32ad69187a 
      :auth:71998c64aea37ae77020c49c00f73fa8") = 2f22e6d56dabb168702b8bb2d4e72453;

    RFC2617 的安全增强的主要方式:

    发起请求的时候,服务器会生成一个密码随机数(nonce)(而这个随机数只有每次"401"相应后才会更新),为了防止攻击者可以简单的使用同样的认证信息发起老的请求,于是,在后续的请求中就有一个随机数计数器(cnonce),而且每次请求必须必前一次使用的打.这样,服务器每次生成新的随机数都会记录下来,计数器增加.在RESPONSE 码中我们可以看出计数器的值会导致不同的值,这样就可以拒绝掉任何错误的请求.

    请求样例(服务端 qop 设置为"auth")

    客户端 无认证

    1
    2
    GET / HTTP/1.1
    Host: localhost

    服务器响应(qop 为 'auth')

    1
    2
    3
    HTTP/1.1 401 Authorization Required
    Date: Thu, 13 Jun 2013 20:25:37 GMT
    WWW-Authenticate: Digest realm="Hi!", nonce="HSfb5dy15hKejXAbZ2VXjVbgNC8sC1Gq", qop="auth"

    客户端请求(用户名: "tom", 密码 "123456")

    1
    2
    3
    4
    5
    6
    7
    8
    9
    GET / HTTP/1.1
    Host: localhost
    Authorization: Digest username="tom",
                         realm="Hi!",
                         nonce="L4qfzASytyQJAC2B1Lvy2llPpj9R8Jd3",
                         uri="/",
                         qop=auth,
                         nc=00000001,
                         cnonce="c2dc5b32ad69187a",                     response="2f22e6d56dabb168702b8bb2d4e72453"

    服务端应答

    1
    2
    3
    4
    HTTP/1.1 200 OK
    Date: Thu, 13 Jun 2013 20:25:37 GMT
    Content-Type: application/json; charset=utf-8
    Content-Length: 53

    注意qop 设置的时候慎用:auth-int,因为一些常用浏览器和服务端并没有实现这个协议.

  • 相关阅读:
    什么是模块化及其优点是什么
    oop的三大特性和传统dom如何渲染
    MVC和MVVM的差别
    SpringMVC实例及注解(二)
    Spring MVC实例创建(一)
    Mybatis联合查询(一)
    Mybatis参数传递及返回类型
    Mybatis实例增删改查(二)
    Mybatis实例及配置(一)
    SpringMVC
  • 原文地址:https://www.cnblogs.com/bukudekong/p/3835551.html
Copyright © 2011-2022 走看看