论坛首页 入门技术论坛

普通 http 下可靠的网路认证方式

浏览 1437 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2009-04-01   最后修改:2009-04-09
认证过程:

    服务器:对客户端的每次请求,每一次都生成一个随机字符串(变码),该字符串传递到客户端,同时也存储到 Session 中,用于客户端下一次的身份认证。

    客户端:在每次请求发出前,用上次接收的变码和基码计算:md5(基码 + 变码)。请求发出时,将该值一同发送到服务器进行身份的确认。

原理简图:


(图注:在一次会话中,基码的传递是一次性的,随后即脱离 https 进入普通的 http 通讯)

功能:

    可以完全地保证普通 http 网路中会话的身份可靠性 ——即使会话 ID 被劫持盗用也是安全的。
    这里,会话 ID 不是用于身份的确认,而只是用于检索会话数据的索引,如果认证不通过,便不会使用该索引检索进一步的数据。

    其次,因为基码是不会在客户端和目标网站间传递的,所以,它也可以被用作数据加/解密的密钥。这样,在普通 http 明文传输的情况下,不但用户身份可唯一安全的确定,并且其内容数据也可得到安全的加密传输。


前提:

    目标网站可以与 https 认证系统进行通讯以创建和取得基码。

    方法可以有多种,如:

    A、 由目标网站创建基码,发起 https 请求传递基码(和一个索引码)到认证服务器;用户从 https 认证服务器登录,成功后按索引码取得基码。这种方法具有完全的安全性。

    B、 目标网站可以访问 https 认证系统的后台数据库取得基码。这时是由认证服务器创建基码(和一个索引码),客户端通过索引码让目标网站从认证系统的后台数据库中获得基码。

    C、 可以通过文件系统存储基码达到目的。此时也由认证服务器创建基码(和一个索引名),同时向目标网站请求写入基码,文件名为索引名,文件内容为基码。客户端在 https 下获取基码存储到本地,同时以此索引码确认当前会话中服务器使用的基码。

说明:

    如果 https 认证服务器是完全独立的,即目标网站无法或不设置和认证服务器后台数据库通讯的权力,则可采用 A、C 两种方式。这两种方式中后者是不完全安全的,因为认证服务器和目标网站的基码传递是明码。

    这种 https 认证服务器独立的方式,使得可以创建通用的认证服务器。

    如果 https 认证服务器和目标网站共享用户数据库,则可采用 B 的方式,其安全性决定于 Web 服务器和数据库间的连接。


< 浏览器中实现的思路 >
==================
(对应上述获取基码的 A 方式)

    开创 3 个类型的数据存储,处于安全性考虑,存储区仅由浏览器内部使用,不对外开放。
    存储区可以限定为只存储字符串。

    1、
    特定于窗口的「暂存区」,需要引用窗口才能操作该数据,功能取代在 location hash 存储跨域交换数据(指 JS 实现版本)。
    该区为只写,由服务器端的回应头设置,比如:

        WWW-Authenticate: third2auth    # 声明认证类型(乱取的名字哦 ^o^)
        Pragma: code-temp name string   # 对命名窗口 name 设置其暂存区数据为 string。

    2、
    与特定域相关的「基码区」。该区数据只能由浏览器取暂存区数据设置。它由回应头发出一个请求来实施。比如:

        WWW-Authenticate: third2auth
        Pragma: code-base name     # 请求 winname 窗口暂存区的数据为自身域的基码。

    3、
    与特定域相关的「变码区」。该区数据由回应头携带的数据设置,比如:

        WWW-Authenticate: third2auth
        Pragma: code-case string     # 设置变码区数据为 string。


    认证前过程:

    1、
    用户请求目标网站登录页面,登录页面创建基码,并与 https 认证服务器通讯传递基码和一个索引码A。
    如果与认证服务器的通讯成功完成,携带索引码A嵌入(或跳转到)认证服务器的登录窗口。
    用户在 https 登录窗口填写登录信息进行登录认证。

    图示:


    2、
    用户通过 https 认证服务器登录,成功后服务器根据索引码获取基码,同时生成用户身份 ID 的检索码B。
    认证服务器返回一个设置基码到暂存区的请求(code-temp),同时携带检索码B嵌入(或跳转到)原始目标网站的认证确认页面。

    图示:


    3、
    目标网站的认证确认页面根据检索码获取用户身份 ID(目标网站的授权是根据用户的身份 ID 进行的),同时返回一个包含了提取基码的头信息(code-base),于是将基码存储在了浏览器的本域基码区中。

    图示:


    至此,通过 https 的预认证完成,以后的动态认证和通讯就完全脱离对 https 的依赖。

===============================================================================
※ 授权:原创文章,欢迎转载,但请注明出处 @ Liner@iteye.com

  • 大小: 12.1 KB
  • 大小: 15.1 KB
  • 大小: 9.6 KB
  • 大小: 11.4 KB
论坛首页 入门技术版

跳转论坛:
Global site tag (gtag.js) - Google Analytics