如何使用 LTPA 令牌中的信息

2024-02-25

考虑以下设置:

  • 部署在 Websphere Application Server 上的 Web 应用程序(6.1,如果重要的话)
  • 该应用程序将通过 webseal 反向代理进行访问
  • webseal 负责身份验证并传递 LTPA 令牌作为有效身份验证的标志

如果我没猜错的话,LTPA 令牌包含用户名、角色等信息。

问题:如何从 Java Web 应用程序中的 LTPA 令牌访问此信息?


查看 LTPA 令牌的内部对于调试来说非常有用,我们经常使用它。您需要 ltpa 密钥和密码才能正常工作



/* Copyright notice
# Copyright (C) 2007, Cosmin Stejerean (http://www.offbytwo.com)
#
# You are free to use this code under the terms of the Creative Commons Attribution license
# available at http://creativecommons.org/licenses/by/3.0/
# so long as you include the following notice 'includes code from Cosmin Stejerean (http://www.offbytwo.com)'
*/

import java.security.Key;
import java.security.MessageDigest;
import java.security.spec.KeySpec;
import java.sql.Date;
import java.text.SimpleDateFormat;
import java.util.Arrays;
import java.util.StringTokenizer;

import javax.crypto.Cipher;
import javax.crypto.SecretKeyFactory;
import javax.crypto.spec.DESedeKeySpec;

import sun.misc.BASE64Decoder;


//The shared 3DES key is itself encrypted using the SHA hash value of the LTPA password (padded with 0x0 upto 24 bytes).

public class LtpaDecoder
{
    private String ltpa3DESKey = "JvJRzwdhKk6o40FuATa9acKD2uaXswVHlUsn2c2+MKQ=";
    private String ltpaPassword = "secretpassword";

    private String sUserInfo = "";
    private Date dExpiry;
    private String sFullToken = ""; 
    private String sSignature = "";

    public static void main(String[] args)
    {
          String tokenCipher = "vsof5exb990sb2r5hRJ+bneCnmBTuLQ3XF+......";

          try {
            LtpaDecoder t = new LtpaDecoder(tokenCipher);
            System.out.println("UserInfo: " + t.getUserInfo());
            System.out.println("Expiry: " + t.getExpiryDate());
            System.out.println("Full token: " + t.getFullToken());
        }
        catch(Exception e) {
            e.printStackTrace();
        }
    }

    public LtpaDecoder(String fulltoken) throws Exception {
        byte[] secretKey = getSecretKey(this.ltpa3DESKey, this.ltpaPassword);
        String ltpaPlaintext = new String(decryptLtpaToken(fulltoken, secretKey));

        extractTokenData(ltpaPlaintext);
    }

    private void extractTokenData(String token)
    {
        System.out.println("\n");
        StringTokenizer st = new StringTokenizer(token, "%");

        sUserInfo = st.nextToken();
        String sExpires = st.nextToken();
        sSignature = st.nextToken();
        dExpiry = new Date(Long.parseLong(sExpires));
        sFullToken = token;
    }

    public String getSignature() {
        return sSignature;
    }

    public String getFullToken() {
        return sFullToken;
    }

    public String getUserInfo() {
        return sUserInfo;
    }

    public String getExpiryDate() {
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss z");
        return sdf.format(dExpiry);
    }

    private byte[] getSecretKey(String shared3DES, String password) throws Exception
    {
        MessageDigest md = MessageDigest.getInstance("SHA");
        md.update(password.getBytes());
        byte[] hash3DES = new byte[24];
        System.arraycopy(md.digest(), 0, hash3DES, 0, 20);
        Arrays.fill(hash3DES, 20, 24, (byte) 0);
        // decrypt the real key and return it
        BASE64Decoder base64decoder = new BASE64Decoder();
        return decrypt(base64decoder.decodeBuffer(shared3DES), hash3DES);
    }

    public byte[] decryptLtpaToken(String encryptedLtpaToken, byte[] key) throws Exception 
    {
        BASE64Decoder base64decoder = new BASE64Decoder();
        final byte[] ltpaByteArray = base64decoder.decodeBuffer(encryptedLtpaToken);
        return decrypt(ltpaByteArray, key);
    }

    public byte[] decrypt(byte[] ciphertext, byte[] key) throws Exception {
        final Cipher cipher = Cipher.getInstance("DESede/ECB/PKCS5Padding");
        final KeySpec keySpec = new DESedeKeySpec(key);
        final Key secretKey = SecretKeyFactory.getInstance("TripleDES").generateSecret(keySpec);

        cipher.init(Cipher.DECRYPT_MODE, secretKey);
        return cipher.doFinal(ciphertext);
    }
}
  
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何使用 LTPA 令牌中的信息 的相关文章

  • MP3:一种以毫秒为单位获取任何给定字节位置的位置的方法?

    我创建了一个 servlet 它返回从客户端请求的任何给定字节位置开始的流 来自 MP3 文件 这允许客户端在任何给定字节位置立即开始播放 而无需进行任何本地查找 现在 我有一个滑块可以直观地显示进度 我正在使用当前字节位置来更新滑块 但是
  • Java 重写 hashCode() 得到 StackOverflowError

    所以我不太熟悉重写 hashCode 并且我似乎在 hashCode 方法中以某种方式进行了一些无限递归 这是我的场景 我有一个 DuplicateCache 类 它是一个缓存对象 用于检查系统中的重复对象 我有一个静态内部类 Duplic
  • 方法断点可能会大大减慢调试速度

    每当向方法声明行添加断点 在 Intellij IDEA 或 Android Studio 中 时 都会出现一个弹出窗口 方法断点可能会大大减慢调试速度 为什么会这样戏剧性地减慢调试速度 是我的问题吗 将断点放在函数的第一行有什么不同 Th
  • JavaFX - setVisible 隐藏元素但不重新排列相邻节点

    在 JavaFX 中 如果我有一个场景有 2VBox元素和每个VBox有多个Label in it 如果我设置顶部VBox to 无形的 为什么底部VBox 不向上移动顶部的场景VBox was The VBox is 无形的但我希望其他物
  • 场景生成器删除 fxml 文件中的导入

    我使用场景构建器 Gluon Scene Builder JavaFX Scene Builder 8 1 1 来创建应用程序的 UI 并使用 Eclipse 开发 JavaFX 现在 每次我在场景生成器中保存某些内容时 它都会从 fxml
  • 所有junit测试后的清理

    在我的项目中 我必须在所有测试之前进行一些存储库设置 这是使用一些棘手的静态规则来完成的 然而 在所有测试之后我不知道如何进行清理 我不想保留一些神奇的静态数字来引用所有测试方法的数量 我应该一直维护它 最受赞赏的方法是添加一些侦听器 该侦
  • Install4j:如何在安装结束时执行命令行 java -jar filename.jar

    在 Intall4j 中 在安装结束时 我只想通过执行如下命令行来初始化某些内容 java jar filename jar 我怎样才能归档这个任务install4j Thanks 将 运行可执行文件或批处理文件 操作添加到 安装屏幕 并设
  • 如何在java中使jpeg无损?

    有没有人可以告诉我如何使用编写 jpeg 文件losslessjava中的压缩 我使用下面的代码读取字节来编辑字节 WritableRaster raster image getRaster DataBufferByte buffer Da
  • 打印包含 JBIG2 图像的 PDF

    请推荐一些库 帮助我打印包含 JBIG2 编码图像的 PDF 文件 PDFRenderer PDFBox别帮我 这些库可以打印简单的 PDF 但不能打印包含 JBIG2 图像的 PDF PDFRenderer尝试修复它 根据 PDFRedn
  • 覆盖 MATLAB 默认静态 javaclasspath 的最佳方法

    MATLAB 配置为在搜索用户可修改的动态路径之前搜索其静态 java 类路径 不幸的是 静态路径包含相当多非常旧的公共库 因此如果您尝试使用新版本 您可能最终会加载错误的实现并出现错误 例如 静态路径包含 google collectio
  • 不兼容的类型:在 java netbeans 中对象无法转换为 String

    我试图在我的项目中使用对象数组 但出现错误 incompatible types Object cannot be converted to String 在这一行 ST1 new String emt1 emt2 emt3 emt4 现在
  • OpenJDK 版本控制

    上下文 我想确保我们系统上安装的 Java 不受 CVE 2022 21449 的影响 java version 给出 openjdk version 11 0 7 2020 04 14 LTS OpenJDK Runtime Enviro
  • 如何为 Jackson 编写一个包罗万象的(反)序列化器

    当您提前知道类型时 编写自定义序列化器非常容易 例如 MyType一个人可以写一个MyTypeSerializer extends StdSerializer
  • 从 Stax XMLStreamReader 读取以解组部分

    我正在使用 Stax 游标 API 从大型 xml 文件中提取数据 当前 我转到特殊标签的开头并使用 JAXB 解组该标签 这对于格式良好的 xml 文件效果很好 但不久前我有一个文档 其中数十万个标签中有一个未关闭 JAXB 使用 XML
  • 如何在keycloak中动态编辑standalone.xml文件

    我正在尝试通过 docker 编辑standalone xml 并尝试添加 但 keycloak 正在使用它standalone xml 但我可以看到standalone xml 文件中的更改 我需要在standalone xml 文件中添
  • 在 Selenium WebDriver 上如何从 Span 标签获取文本

    在 Selenium Webdriver 上 如何从 span 标记检索文本并打印 我需要提取文本UPS Overnight Free HTML代码如下 div id customSelect 3 class select wrapper
  • 如何在android sdk上使用PowerMock

    我想为我的 android 项目编写一些单元测试和仪器测试 然而 我遇到了一个困扰我一段时间的问题 我需要模拟静态方法并伪造返回值来测试项目 经过一些论坛的调查 唯一的方法是使用PowerMock来模拟静态方法 这是我的 gradle 的一
  • 从java中的字符串数组中删除空值

    java中如何从字符串数组中删除空值 String firstArray test1 test2 test4 我需要像这样没有 null 空 值的 firstArray String firstArray test1 test2 test4
  • 重写Object类的finalize()方法有什么用?

    据我所知 在java中如果我们想手动调用垃圾收集器 我们可以执行System gc 1 我们在重写的finalize 方法中做了哪些操作 2 如果我们想手动调用JVM垃圾收集器 是否需要重写finalize 方法 我们在重写的 Finali
  • Spring Boot MSSQL Kerberos 身份验证

    目前在我的春季靴子中application properties文件中 我指定以下行来连接到 MSSql 服务器 spring datasource url jdbc sqlserver localhost databaseName spr

随机推荐

  • 从 R 的句子中提取动词?

    请注意 我知道从文本中提取名词和动词 https stackoverflow com questions 2970829 extracting nouns and verbs from text它对我不起作用 因为他们使用的功能不存在于op
  • Android HTML Jsoup

    我试图从我的拼贴新闻网站获取图像的绝对 URL 但到目前为止还没有成功 我正在这个网站上工作http www dcu ie news index shtml http www dcu ie news index shtml 正如您从源中看到
  • Angular 2 AsynPipe 不支持 Observable

    我收到以下错误 EXCEPTION Cannot find a differ supporting object object Object in files async in Images 1 9 这是模板的相关部分 img 这是我的代码
  • 如何使基类中的所有隐藏名称在派生类中可访问?

    从这个问题开始 从纯虚类 A 派生的指针无法访问纯类 B 的重载方法 https stackoverflow com questions 59756738 pointer derived from pure virtual classa c
  • 使用 ui-router 和 AngularJS 的多个嵌套 ui-views

    我只想首先说 我尽可能多地查看了与此问题相关的堆栈溢出问题 但没有看到任何与我遇到的问题有关的问题 有些很相似 但又不完全一样 问题是这样的 我设置了以下 stateProvider stateProvider state root url
  • 如何在 FCM 通知中创建主题

    我正在尝试 Firebase Notification API 当我从控制台向应用程序发送下游消息时 该服务工作得非常完美 但是如何向主题注册用户发送消息 我在android端做了 FirebaseMessaging getInstance
  • 在 symfony 中找不到 PHP 模板

    我是 symfony 的新手 我想使用 PHP 模板引擎 以下是我为使其发挥作用而遵循的步骤 1 在config yml中启用PHP模板引擎 templating engines twig php 2 在routing yml中定义我的控制
  • 错误:无法在 Eclipse 中找到或加载主类

    我在 Eclipse 4 2 中运行项目时遇到问题 我有一个 Java 程序 其中有一个名为 Conversion 的类 Eclipse 可以很好地构建该项目 我可以通过导航到工作区中项目文件夹中的 bin 并输入以下命令来从命令行运行该程
  • 如果持续的接口反模式是一种犯罪行为,那么 Swing 为什么要这样做呢?

    我正在制作一个 Swing 应用程序 并意识到我有一些类需要访问同一组常量 我无法让自己宣布其中一个是它们的主要持有者 并将它们全部放在那里并让其他人参考 我想 嘿 我会让它们都从某个共同的地方继承 但 Java 不做多重继承 但我可以在事
  • Git:哪个是分支的默认配置远程?

    我有一个远程裸存储库hub 我只在master分支 下面这个错误消息的最后一句话让我想知道 我如何找出哪个是 当前分支的默认配置远程 我该如何设置它 myserver progs git remote v hub sitehub progs
  • c,传递结构作为参数

    我需要像这样传递一些结构作为函数参数 void myFunc unsigned char c 我会用myFunc 4 myFunc 8 or so 现在该函数接受一个结构作为参数 所以我尝试了 typedef struct unsigned
  • 使用 VBA 更改 Excel 图表的方向(纵向或横向)

    我正在尝试编写一个宏来自动打印我使用另一个宏在工作簿中创建的所有图表 实际上是数百个 我遇到的问题是我无法弄清楚如何使用 VBA 将图形从纵向布局更改为横向布局 我想知道是否有人可以帮助我 我尝试了下面的代码 但它在 ChartObject
  • Javascript正则表达式匹配JSON键值对的值

    给定以下键值对 我如何才能仅匹配值 包括引号 解释 我正在 IDE 中进行查找和替换 我有数百个键 值对 其中的值需要从字符串更改为对象 所以基本上替换了值 ElevationFilenameIn Input raster elevatio
  • Python set([]) 如何检查两个对象是否相等?对象需要定义哪些方法来自定义 this?

    我需要在 Python 中创建一个 容器 对象或类 它保存我也定义的其他对象的记录 该容器的一个要求是 如果两个对象被认为是相同的 则删除一个 任一对象 我的第一个想法是使用set 作为包含对象 来完成这个要求 但是 该集合不会删除两个相同
  • 为什么当我启动调试器时,我的 Visual Studio 2005 会与进程分离?

    我正在使用 VS2005 开发 Web 应用程序 当我开始调试时 它将打开网页 但立即从进程中分离 我发现如果我关闭 IDE 并重新启动它 它会正常工作一段时间 但随后又开始分离 任何对这种奇怪行为的见解都将不胜感激 你用的是IE8吗 我最
  • 让登台服务器与生产服务器相同的主要目的和意义是什么?

    在我们公司 我们有临时服务器和生产服务器 我试图在最新版本发布后让它们处于 1 1 状态 我们已经在多个主机及其许多实例上运行了 Web 应用程序 问题是 我主张在临时服务器和生产服务器上使用相同的 Web 应用程序架构 结构 以便轻松测试
  • 如何使用schedule启动一个cron作业:在Laravel 5中手动运行(实际上是10月CMS)

    我知道如何在 Linux 服务器上运行 cron 作业 我知道如何使用 schedule gt command foo gt daily 我已多次阅读此文档https laravel com docs 5 0 artisan https l
  • 我应该等待 ajax 完成才能重定向页面吗?

    I know how等待 ajax 完成 但是如果我要在一些 ajax 调用被触发后重定向页面 我应该在重定向之前等待它们完成吗 有关系吗 如果您确信 ajax 调用会成功 那么一旦 ajax 调用发生 就您的服务器而言 重定向不会影响它
  • CakePHP:从 3.9.x 升级到 4.0:bin/cake 升级 ector --rules phpunit80 挂起

    我正在将 CakePHP 3 应用程序升级到 CakePHP 4 并遵循升级指南 但是 那bin cake upgrade rector rules phpunit80
  • 如何使用 LTPA 令牌中的信息

    考虑以下设置 部署在 Websphere Application Server 上的 Web 应用程序 6 1 如果重要的话 该应用程序将通过 webseal 反向代理进行访问 webseal 负责身份验证并传递 LTPA 令牌作为有效身份