剖析LtpaToken(实现B/S应用间的安全SSO)

来源:互联网 发布:如何学windows api 编辑:程序博客网 时间:2024/06/05 07:18

一、  WebSphereDomino之间的SSO

       首先让我们来了解一下WebsphereDomino之间是怎么完成SSO的:

 

1、  Web用户向Websphere发起一个登录请求。

2、  Websphere判断为合法用户,登录成功。

3、  生成ltpatoken,将ltpatoken写入cookie

 

这样,当Web用户后续向Domino发起登录请求时,Domino会找到存放在cookie信息中的ltpatoken信息,并且认为这个ltpatoken有效,完成在domino的登录过程。那么这里会有2个疑问。第1个,Domino怎么会找的到Websphere存放的cookie,这就是为什么配置SSO的时候需要2个系统是在同一个DNS域下面,因为浏览器cookie共享的限制,跨域不能共享cookie嘛(当然也能用一些其他的手段生成跨域的cookie,这样其实通过一定的开发是可以让LTPATOKEN跨域的,本案例不讨论这个问题)。第2个问题,domino找到这个token之后,凭什么认识这个ltpatoken,并且认为它有效呢,所以要求dominoWebsphere在生成ltpatoken的时候就有某种约定。这就是为什么配置Domino SSO文档的时候需要引入Websphere的密钥了。有了这些前提DominoWebsphere之间就能互相认识对方生成的ltpatoken,并且从中读出需要登录的用户名,只要用户名匹配得上(这就是为什么WD需要用同一个LDAP目录),该用户就完成登录了。 以上就是简单的WebsphereDomino之间SSO的原理。当然其实SSO过程还没有这么简单,比如还需要验证ltpatoken的有效期等。

       现在我们知道实现SSO的关键在于LtpaTokenWebsphereDomino之间采用LtpaToken来共享认证信息。

那么基本上任何一个系统只能要完成以下2件事情,它就有可能参与LtpaToken认证的SSO方案了:

1、  能生成一个有效的LtpaToken提供给别人。     

2、  能解析一个别人生成的LtpaToken

另外,可能还有一些要求:

1、  参与SSO的系统使用同样的密钥生成LtpaToken,称为公钥。

2、  参与SSO的用户帐号名称在各系统中一致,因为每个系统从Token中读出了用户名之后必须要正确关联到本地对应的用户进行登录。

3、  参与SSO的系统必须在同一个DNS域下面(跨域的问题前面提过)。

4、  最后当然需要采用B/S方式,浏览器必须支持Cookies了。

 

 

 

 

 

 

 

 

 

 

一、  LtpaToken组成原理

通过了解LtpaToken的组成原理,我们就可以自己编码生成和解析LtpaToken了。首先一个LtpaToken的合成公式如下:

[token] = BASE64([header][creation time][expiration time][username][SHA-1 hash])

解释:

n         Header:  LtpaToken 版本(长度4),Domino的固定为[0x00][0x01][0x02][0x03]

n         Creation time: 创建时间戳(长度8),格式为Unix time比如[2010-03-12 00:21:49]4B99189D

n         expiration time:过期时间戳(长度8 同上

n         username 用户名(长度不定)

n         SHA-1 hashSHA-1校验和(长度20

如下图:

 

 

上面的SHA-1校验和,又是由前面所说的密钥和其余的Token资料合并而成,合成公式如下:

[SHA-1 hash] = SHA-1([header][creation time][expiration time][username][shared secret])

 

所以,如果有人篡改了Token,那校验和就与修改后的Token匹配不上了,这样Token一旦生成,有人想要修改它的信息,比如改成别的用户名,是不可能的。

二、  Domino如何处理LtpaToken

查看一下dominoWeb SSO配置文档:

1、  Domino生成LtpaToken的密钥存放在LTPA_DominoSecret字段

2、  LTPA_TokenExpiration字段存放失效分钟数。

3、  LTPA_TokenName字段存放Token表示在cookiename

….如下图:

 

再加上上面分析过的LtpaToken组成原理,我们大概可以知道domino是怎么生成LtpaToken的了。详细的debug信息可以通过在notes.ini里面配置条目DEBUG_SSO_TRACE_LEVEL=2之后去查看日志。

      

       Domino解析LtpaToken步骤:

1、  Base64解码LtpaToken

2、  截取最前面20字节,最后面20字节,中间部分就是用户名。如果用户名在本系统中不正确,返回无效的LtpaToken

3、  截取最后面20字节,是SHA-1校验和。用Token中的其余部分和本系统中的密钥生成新的SHA-1校验和,如果2个校验和不匹配。返回无效的LtpaToken

4、  当前服务器时间必须大于创建时间,小于失效时间。否则返回无效的LtpaToken

5、  最后解析通过了,完成用户的登录

 

6、    Java应用上实现生成和解析LtpaToken的测试

2.1    生成LtpaToken的测试

 

文件列表:

Base64.java            base64编码和解码的类

Bundle.java            properties资源文件的处理类

LtpaConfig.java      Token资料配置类。

LtpaToken.java       产生和解析LtpaToken的类

LtpaConfig_zh_CN.properties       配置文件

 

第一步,配置LtpaConfig_zh_CN.properties,填好ltpaSecret。这个值本身是base64编码。

如果是和dominosso。需要从dominoweb sso文档中获取,见上一张图。

tokenDomain信息是生成http cookie的时候用的,本测试中暂不用到。

tokenExpiration是生成LtpaToken时用的,本测试中暂也不用。

 

第二步,添加一个测试的类:

main函数中输入以下测试代码:

 

Date date = new Date();

String user="CN=Admin/O=S3D";

LtpaToken generate = LtpaToken.generate(user, date, new Date(date.getTime() + 20*60000));

System.out.println(generate);

 

以上代码为CN=Admin/O=S3D生成一个20分钟有效期的LtpaToken

输出:

 

 

domino去验证Token的有效性:

1、  复制上面产生的Token.

2、  打开IE,输入Domino服务器的首页地址:http://devp.s3d.com/

3、  出现登录页面,这里不输入用户名和密码。直接在IE地址栏里面输入:  

javascript:alert(document.cookie="LtpaToken=AAECAzRCOTlEOTQxNEI5OURERjFDTj1BZG1pbi9PPVMzRKb6cFIxqIX+lGjQhDDWaeN4IvXe");

以上红色部分是复制的Token

4、  弹出对话框,cookie设置成功,按F5刷新页面,成功以Admin身份登录Domino主页,LtpaToken测试成功。

 

2.2    解析LtpaToken的测试

下面测试解析一个由Domino产生的LtpaToken

1、  打开一个新的IE窗口,输入Domino服务器的首页地址:http://devp.s3d.com/

2、  输入一个普通用户的帐号/密码,正常进入首页。

3、  IE地址栏输入:javascript:document.write(document.cookie)

4、  复制出Cookie中的LtpaToken的值,如:

AAECAzRCOTlEQTZGNEI5QTgzMkZDTj1saXVnYW5nMi9PPWVzc2VuY2VzZNmGPcgH0NQxnrhgnn1/JrPkHgg=

 

在测试类中添加以下测试代码:

LtpaToken ltpa = new LtpaToken("AAECAzRCOTlEQTZGNEI5QTgzMkZDTj1saXVnYW5nMi9PPWVzc2VuY2VzZNmGPcgH0NQxnrhgnn1/JrPkHgg=");

    //token中取出用户名

        System.out.println(ltpa.getUser());

    //验证一个token是否有效

        if(ltpa.isValid()){

        System.out.println("token是有效的");

        }

输出以下内容:

 

到这里,解析LtpaToken测试成功。

 

7、    总结

LtpaToken非常安全方便,不失为一种较好的SSO解决方案。

1、  通过以上对LtpaToken的了解:可以给大多数B/S应用配置使用基于LtpaTokenSSO

 

原创粉丝点击