WEBSSO:基于Diffie Hellman密钥交换协议和Cookie的WEB同域单点登录系统基本原理

2014-05-27 1,491 0 大学 大超超。

基于Deffie Hellman密钥交换协议和Cookie的WEB同域单点登录系统

假定两种页面:

  1. 需要登录的页面(如个人中心http://www.site.com/user),下称“页面A”;

  2. 单点登录入口页面http://passport.site.com/login,下称“页面B”;

普通登录逻辑:

  1. 用户访问页面A的时候,服务器通过session(服务器为当前连接用户生成的文件,一般保存在服务器的临时文件目录下)检测到用户没有登录,并且通过cookie检测发现没有在其他同域网站下单点登录;

  2. 此时服务器执行以下内容:

    1. 使用Diffie Hellman算法生成大质数P、指数次幂基数G、私钥A和通过私钥A计算的G^A mod P

    2. 将这四个数字按顺序用英文逗号,分隔组成形如14489,5,4237,8426的字符串存入当前访问用户的session中;

    3. 生成cookiepanel_login_dh:形如14489,5,8426的字符串(服务器生成Diffie Hellman的数据后,将私钥A隐藏):

      • 第一个数字是随机生成的大质数P

      • 第二个数字是指数次幂的基数G,一般是2或者5,我们取5

      • 第三个数字是服务器端通过自己的私钥A计算的G^A mod P

    4. 使用状态码30X将用户导向页面B,并将cookiepanel_login_dh发送到用户浏览器;

  3. 用户浏览器接收到cookiepanel_login_dh(带有PGG^A mod P)后,生成自己的私钥B,并计算G^B mod P(G^A mod P)^B mod P(即(G^A)^B mod P),用英文逗号,分隔并写入cookiepanel_login_dh_client,同时用户在页面B上输入账号、密码并点击登录;

  4. 服务器接收到用户登录的请求,并且能从数据库里取出此账号、密码对应的用户ID,此时通过验证并登录成功;

  5. 基于用户成功登录,服务器将进行加密运算,为下次单点登录作准备,主要运算为:

    1. 生成随机密钥key_root,通过AES算法将key加密,服务器对此用户的私钥A作为密钥,得到进一步加密后的密钥key

    2. 生成带有用户登录时环境信息(在第5步作解释)的字符串enc

    3. 通过AES算法将enc加密,key_root作为密钥,得到预发送cookiepanel_login_enc

  6. 完成以上加密运算后,服务器会生成下列cookie发送到用户浏览器:

    • panel_login_status:是否登录的状态,1表示已登录,0表示未登录,这里是1

    • panel_login_uid:用户的ID,可以通过数据库查询取得用户的所有其他信息;

    • panel_login_key:随机密钥key,并通过AES加密算法加密,根密钥是panel_login_dh中的G^A mod P;

    • panel_login_enc:形如PO/cUAn8gx6nd8n40KinSc5HQKjUkGipYPa9mknV9tgVhzJI5P5xJ8BjsKU3plniGl9HfKe5jQxwZqyb9PrP5w==的字符串,加密前是形如3d0dbd290ef942da46f763215a37b84a-1401087470-127.0.0.1的字符串,包含了当前登录的用户信息及用户登录时的环境信息,使用-分隔:

      1. 第一个参数3d0dbd290ef942da46f763215a37b84a是用户使用的浏览器User-Agent通过md5消息摘要算法得到的32位串;

      2. 第二个参数1401087470是用户登录成功那一刻的时间戳,用以在后续单点登录时实现基于时间线的验证;

      3. 第三个参数127.0.0.1是用户登录成功时使用的ip地址,和第二个参数一起作为验证登录环境的参数;

  7. 完成以上步骤后,就做好了登录信息读取和单点登录信息预留,此时服务器使用状态码30X将用户导回页面A,进入单点登录逻辑。

单点登录逻辑:

  1. 用户访问页面A的时候,服务器通过session(不同域、同一用户,服务器为其生成的session不一致)检测到用户没有登录,但是通过cookie检测发现在其他同域网站下(页面B)有单点登录预留信息;

  2. 此时服务器开始逆序解密:

    1. 去数据库里查询panel_login_uid对应用户的字段里存放的在页面B上生成的私钥A

    2. 通过panel_login_dhpanel_login_dh_client获取PGG^B mod P(G^A)^B mod P

    3. 计算(G^B mod P)^A mod P(即(G^B)^A mod P),验证(G^A)^B mod P(G^B)^A mod P是否相等;

    4. 如果相等,则用A去解密panel_login_key,得到key_root,再用key_root解密panel_login_enc,得到带有用户登录时环境信息的可识别字符串enc

    5. 判断enc中的信息是否与当前登录环境相同,检查User-Agentip和时间;

    6. 完全通过后,取出panel_login_uid对应用户的资料并标记为成功登录;

  3. 此时完成整个单点登录逻辑。

 



声明: 本文由大超超。原创编译,转载请保留链接: http://www.thinkful.cn/archives/482.html