当前位置:编程学习 > 网站相关 >>

LTPA Cookie原理

1. 什么是LTPA?
 
Lightweight Third-Party Authentication (LTPA)是IBM Websphere和Domino产品中使用单点登录技术。当服务器配置好LTPA认证方式,用户通过浏览器成功登录后,服务器会自动发送一个session cookie给浏览器;此cookie中包含一个LTPA Token。
 
 
 
 
--------------------------------------------------------------------------------
 
2. WebSphere部分
 
本部分描述适用于已实施WebSphere系列产品应用和Domino平台应用,或WebSphere与Domino之间已完成单点登录。在这样的环境中与构异系统实现单点登录。
 
一个通过有效的LTPA Cookie能够在同一个认证域中所有服务器被自动认证。此Cookie中包含认证信息和时间戳。这些信息通过共享的3DES Key进行了bis 加密。使用公共密钥/私有密钥进行签名。
LTPA Cookie通过3DES密钥使用DESede/ECB/PKCS5P进行加密。此密钥也是采用DESede/ECB/PKCS5P进行加密,加密后再使用提供的密码再进行SHA Hash,生成24个字节的密钥,再进行Base64编码。
 
如果你要解析LTPA Token,先得使用Key的密码,生成3DES密钥;再使用3DES密钥解密Token Cookie。也可以使用公共/私有密钥来签名或验证LTPA Cookie。
 
--------------------------------------------------------------------------------
 
2.1 WebSphere LTPA 生成原理
首先,这个 cookie 由以下部分组成,以%进行分隔:
用户信息,格式为u:user\:<RealmName>/<UserDN>,如:u:user\:VGOLiveRealm/CN=squallzhong,O=VGOLive Technology
过期时间
签名信息,如:
u:user\:VGOLiveRealm/CN=squallzhong,O=VGOLive Technology%1301558320666%Cy2CAeru5kEElGj0hrvYsKW2ZVsvvcu6Un573aeX55OO4G3EMYWc0e/ZbqDp1z7MS+dLzniuUH4sYWCMpnKdm7ZGabwmV+WcraBl+y+yzwcl722gHVMOnDZAW7U3jEay9Tk2yG4yXkMWU+617xndpVxke2jtS5wIyVVM3q7UDPw=
--------------------------------------------------------------------------------
 
2.2 异构系统所需信息
从WebSphere系统中导出ltpa的key文件,使用文本文件打开,如:
 
com.ibm.websphere.CreationDate=Thu Mar 31 11\:08\:09 GMT+08\:00 2011 com.ibm.websphere.ltpa.version=1.0 com.ibm.websphere.ltpa.3DESKey=7dH4i81YepbVe+gF9XVUzE4C1Ca5g6A4Q69OFobJV9g\= com.ibm.websphere.CreationHost=wasserver com.ibm.websphere.ltpa.PrivateKey=N3bnOE1IbiXNsHXxxemC98iiCnmtw3JUuQvdFjEyh9r2gu+FlQRmG8xp5RBltqc6raI4EgYFhTr+t5/tmRQrFqfNKgvujeJZODeCspohi1V4C0qit7DOoqD9xOOn9Rzdb4PIuJM3ekwuBiZZYTYu7q0TANDygc7VbmwoD3xMPCk5svyvFJ/VshPyg5f7Q+VNM8dlIitU4gK9Qp8VZEqjGoXsYYzYYTQgnwAVtR2GfZtXKlf24EPXSkgUz9j8FwTvcylcKwjS22d6eVjciyAzInnxPqxE2iMRPEFDatHZFox3flsqBswmeDQrAGv8zIiffgP1DLKdjozUyAG+50v97xx7u1RtIrB4B01ik8DuLhw\= com.ibm.websphere.ltpa.Realm=VGOLiveRealm com.ibm.websphere.ltpa.PublicKey=AM04If2+ElGSyVRF0ZEesgvC59vGw8gSIfptjfoXj8iz4C7Ip/KVAu2PDkpQi3LUN/FgVF696tmsegBThks9rmMMHzOix/vGP2721dQZKbD7plOLdWtiY2AYZChsBVkOF26DfiWJ6euxD+a+KNcrfDnu2AXRC/tKncIUJV4LbeJdAQAB所使用的DNS域,如:vgolive.com
过期时间(分钟),如:30
LTPA 3DESKey 密钥及密钥的保护密码
Base DN,如:O=VGOLive Technology或DC=vgolive,DC=com 
注:
在3DESKey中的反斜杠只是为了在JAVA中可解释等于号,所以正确的3DESKey为7dH4i81YepbVe+gF9XVUzE4C1Ca5g6A4Q69OFobJV9g=
用户名可以通过Base Dn验证字进行拼接,如异构系统中用户名为SquallZhong,相应在Domino中的DN就是CN=SquallZhong,O=DigiWin。此类情况仅限于LDAP中的CN与异构系统中的用户名一致。如果不一致,需要异构系统做用户对应 
 
--------------------------------------------------------------------------------
 
2.3 实现
Base64解码/编码所需Jar包:apache-commons-codec-1.3.jar以上
SHA-1的校验使用java.security.MessageDigest类
2.3.1 解析
以下代码为解析从WebSphere或Domino发送过来的LTPAToken Cookie以Java为例:
 
show source01… 
02        // LTPA 3DES 密钥 
03        String ltpa3DESKey = "7dH4i81YepbVe+gF9XVUzE4C1Ca5g6A4Q69OFobJV9g="; 
04        // LTPA 密钥密码 
05        String ltpaPassword = "Passw0rd"; 
06        try { 
07            // 获得加密key 
08            byte[] secretKey = getSecretKey(ltpa3DESKey, ltpaPassword); 
09            // 使用加密key解密ltpa Cookie 
10            String ltpaPlaintext = new String(decryptLtpaToken(tokenCipher, 
11                    secretKey)); 
12            displayTokenData(ltpaPlaintext); 
13        } catch (Exception e) { 
14            System.out.println("Caught inner: " + e); 
15        } 
16… 
17    //获得安全Key 
18    private static byte[] getSecretKey(String ltpa3DESKey, String password) 
19            throws Exception { 
20        // 使用SHA获得key密码的hash值 
21        MessageDigest md = MessageDigest.getInstance("SHA"); 
22        md.update(password.getBytes()); 
23        byte[] hash3DES = new byte[24]; 
24        System.arraycopy(md.digest(), 0, hash3DES, 0, 20); 
25        // 使用0替换后4个字节 
26        Arrays.fill(hash3DES, 20, 24, (byte) 0); 
27        // BASE64解码 ltpa3DESKey 
28        byte[] decode3DES = Base64.decodeBase64(ltpa3DESKey.getBytes()); 
29        // 使用key密码hash值解密已Base64解码的ltpa3DESKey 
30        return decrypt(decode3DES, hash3DES); 
31    } 
32    //解密LtpaToken 
33    public static byte[] decryptLtpaToken(String encryptedLtpaToken, byte[] key) 
34            throws Exception { 
35        // Base64解码LTPAToken 
36        final byte[] ltpaByteArray = Base64.decodeBase64(encryptedLtpaToken 
37                .getBytes()); 
38        // 使用key解密已Base64解码的LTPAToken 
39        return decrypt(ltpaByteArray, key); 
40    } 
41    // DESede/ECB/PKC5Padding解方法 
42    public static byte[] decrypt(byte[] ciphertext, byte[] key) 
43            throws Exception { 
44        final Cipher cipher = Cipher.getInstance("DESede/ECB/PKCS5Padding"); 
45        final KeySpec keySpec = new DESedeKeySpec(key); 
46        final Key secretKey = SecretKeyFactory.getInstance("TripleDES") 
47                .generateSecret(keySpec); 
48        cipher.init(Cipher.DECRYPT_MODE, secretKey); 
49        return cipher.doFinal(cipher
补充:Web开发 , 其他 ,
CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,