5

次の設定を検討してください。

  • Websphere Application ServerにデプロイされたWebアプリケーション(重要な場合は6.1)
  • アプリは、Webシールリバースプロキシを介してアクセスされます
  • Webシールが認証を処理し、有効な認証のサインとしてLTPAトークンを渡します

正しければ、LTPAトークンにはユーザー名や役割などの情報が含まれています。

質問:Java WebアプリケーションのLTPAトークンからこの情報にアクセスするにはどうすればよいですか?

4

2 に答える 2

10

LTPA トークンの内部を調べることは、デバッグに最適です。私たちはこれをよく使用します。これを機能させるには、ltpa-key とパスワードが必要です

/* 著作権表示
# Copyright (C) 2007, Cosmin Stejerean (http://www.offbytwo.com)
#
# このコードは、クリエイティブ コモンズ 表示 ライセンスの条件の下で自由に使用できます。
# http://creativecommons.org/licenses/by/3.0/ で入手可能
# 「Cosmin Stejerean (http://www.offbytwo.com) からのコードを含む」という通知を含める限り
*/

java.security.Key をインポートします。
java.security.MessageDigest をインポートします。
java.security.spec.KeySpec をインポートします。
java.sql.Date をインポートします。
import java.text.SimpleDateFormat;
java.util.Arrays をインポートします。
java.util.StringTokenizer をインポートします。

javax.crypto.Cipher をインポートします。
javax.crypto.SecretKeyFactory をインポートします。
import javax.crypto.spec.DESedeKeySpec;

sun.misc.BASE64Decoder をインポートします。


//共有 3DES キー自体は、LTPA パスワードの SHA ハッシュ値を使用して暗号化されます (最大 24 バイトまで 0x0 で埋められます)。

パブリック クラス LtpaDecoder
{
    プライベート文字列 ltpa3DESKey = "JvJRzwdhKk6o40FuATa9acKD2uaXswVHlUsn2c2+MKQ=";
    private String ltpaPassword = "secretpassword";

    プライベート文字列 sUserInfo = "";
    プライベート日付 dExpiry;
    プライベート文字列 sFullToken = "";
    プライベート文字列 sSignature = "";

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

          試す {
            LtpaDecoder t = 新しい LtpaDecoder(tokenCipher);
            System.out.println("UserInfo: " + t.getUserInfo());
            System.out.println("有効期限: " + t.getExpiryDate());
            System.out.println("完全なトークン: " + t.getFullToken());
        }
        キャッチ(例外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(文字列トークン)
    {
        System.out.println("\n");
        StringTokenizer st = new StringTokenizer(token, "%");

        sUserInfo = st.nextToken();
        文字列 sExpires = st.nextToken();
        sSignature = st.nextToken();
        dExpiry = 新しい日付 (Long.parseLong(sExpires));
        sFullToken = トークン;
    }

    public String getSignature() {
        sSignature を返します。
    }

    public String getFullToken() {
        sFullToken を返します。
    }

    public String getUserInfo() {
        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) が例外をスローする
    {
        MessageDigest md = MessageDigest.getInstance("SHA");
        md.update(password.getBytes());
        バイト[] hash3DES = 新しいバイト[24];
        System.arraycopy(md.digest(), 0, hash3DES, 0, 20);
        Arrays.fill(hash3DES, 20, 24, (バイト) 0);
        // 実際の鍵を復号化して返す
        BASE64Decoder base64decoder = new BASE64Decoder();
        復号化を返します (base64decoder.decodeBuffer(shared3DES), hash3DES);
    }

    public byte[] decryptLtpaToken(String encryptedLtpaToken, byte[] key) が例外をスローします
    {
        BASE64Decoder base64decoder = new BASE64Decoder();
        最終バイト[] ltpaByteArray = base64decoder.decodeBuffer(encryptedLtpaToken);
        復号化を返します (ltpaByteArray、キー);
    }

    public byte[] 復号化 (byte[] 暗号文、byte[] キー) は例外をスローします {
        最終暗号 cipher = Cipher.getInstance("DESede/ECB/PKCS5Padding");
        最終的な KeySpec keySpec = 新しい DESedeKeySpec(キー);
        最終鍵 secretKey = SecretKeyFactory.getInstance("TripleDES").generateSecret(keySpec);

        cipher.init(Cipher.DECRYPT_MODE, secretKey);
        return cipher.doFinal(暗号文);
    }
}
于 2009-10-22T15:25:31.577 に答える
9

LTPA トークンに直接アクセスするのではなく、WebSphere がその認証手順に基づいてセキュリティ コンテキストを確立していると想定します。

その後、使用できます

getUserPrincipal()

HttpServletRequest オブジェクトで、ユーザーの ID にアクセスします。

ロールは現在のリソース (サーベット、ejb ...) に固有であるため、HttpServletRequest メソッドを使用します。

isUserInRole()

ユーザーが役割を持っているかどうかを判断します。

メソッドを使用することもできます

 public static javax.security.auth.Subject getCallerSubject()

グループ メンバーシップを含む詳細なセキュリティ情報を取得します。

于 2009-10-22T14:59:25.970 に答える