【问题标题】:How to decrypt LTPA token version 2如何解密 LTPA 令牌版本 2
【发布时间】:2013-08-27 23:48:09
【问题描述】:
我正在开发一个需要在 WebShpere 和 PHP Web 应用程序之间实现 SSO 的项目。
但是,在我查看了实现 SSO 的可能方法之后,我发现了用于在不同 IBM 技术之间实现 SSO 的 LTPA 令牌。
但是 LTPA 令牌 2 是加密的 cookie 文件。如果我想使用此文件中的信息,例如(用户名、用户名、电子邮件...等),我应该解密它。
我对 LTPA 令牌 2 进行了深入搜索,以下是我从 IBM 找到的最佳定义。
LTPA2 签名是使用 SHA-1 作为散列算法生成的,并且
RSA(1024 位密钥)作为加密算法。数字后
已附加签名,用户数据和签名已加密
使用从 LTPA 密钥文件中获得的 3DES 或 AES 密钥(请参阅
“使用 LTPA 令牌”和“生成 LTPA 令牌”)。
但我仍在尝试解密此令牌,但没有运气。
有什么帮助吗?
【问题讨论】:
标签:
java
php
encryption
websphere
single-sign-on
【解决方案1】:
Alfresco 项目做到了这一点。看看这个blog post 的指针,包括工作代码。
为了澄清,LTPA 令牌的内容是或多或少类似于“uid=user,cn=users,ou=myorg,dc=com@ldaprealm%timeout%[RSA signature]”的字符串,使用共享 AES 密钥并使用 Base64 编码。 LTPA v2 将不使用 3DES,而仅使用 AES。因此,您真正需要做的是对 cookie 进行 AES 解密,并且您已经可以读取用户名。您不必必须验证 RSA 签名。
【解决方案2】:
为什么需要从文件中解密?令牌不是与您进行的调用一起传递的吗?传递时,LTPA 令牌通过 Base64 进行编码,您可以轻松地对其进行解码。下面是一个如何从token中获取信息的例子:
import javax.security.auth.Subject;
import javax.xml.bind.DatatypeConverter;
import com.ibm.websphere.security.cred.WSCredential;
import com.ibm.wsspi.security.token.Token;
Subject subject = ...; // obtain current JAAS subject
Set<?> publicCredentials = subject.getPublicCredentials();
for (Object credential : publicCredentials) {
if (credential instanceof Token) {
System.out.println(DatatypeConverter.printBase64Binary(((Token) credential).getBytes()));
System.out.println(((Token) credential).getName());
System.out.println(((Token) credential).getUniqueID());
System.out.println(((Token) credential).getAttributeNames());
}
}