パスワード生成
送信用のパスワードをエンコードする限り、真にセキュリティを強化する唯一のエンコードは暗号化です。Base-64 または 16 進数を使用するのはセキュリティのためではなく、XML のようなテキスト形式に含めることができるようにするためです。
エントロピーは、パスワードの品質を測定するために使用されます。そのため、ランダムな「コイン フリップ」で各ビットを選択すると、最高品質のパスワードが得られます。パスワードを他の暗号化キーと同じくらい強力にする必要があるため、最低でも 128 ビットのエントロピーをお勧めします。
パスワードをテキストとしてエンコードする方法に応じて、2 つの簡単な方法があります (これは、セキュリティの観点からは重要ではありません)。
Base-64の場合、次のようなものを使用します。
SecureRandom rnd = new SecureRandom();
/* Byte array length is multiple of LCM(log2(64), 8) / 8 = 3. */
byte[] password = new byte[18];
rnd.nextBytes(password);
String encoded = Base64.encode(password);
以下では、Base-64 エンコーダを用意する必要はありません。結果のエンコーディングはそれほどコンパクトではなく (24 文字ではなく 26 文字)、パスワードのエントロピーはそれほど多くありません。(しかし、130 ビットは既に大量であり、人間が選択した少なくとも 30 文字のパスワードに匹敵します。)
SecureRandom rnd = new SecureRandom();
/* Bit length is multiple of log2(32) = 5. */
String encoded = new BigInteger(130, rnd).toString(32);
新しい SecureRandom オブジェクトの作成には計算コストがかかるため、パスワードを頻繁に生成する場合は、インスタンスを 1 つ作成して保持することをお勧めします。
より良いアプローチ
XML 自体にパスワードを埋め込むのは間違いのようです。
まず第一に、送信されたドキュメントを処理する前に、送信者を認証したいようです。私があなたの根性を嫌い、サービス拒否攻撃を実行するために巨大な XML ファイルを送信し始めたとします。私が正当なパートナーではないことを確認するためだけに XML を解析する必要がありますか? サーブレットが認証されていないユーザーからの要求を最初から拒否した方がよいのではないでしょうか?
第 2 に、正当なパートナーのパスワードは、送信中は HTTPS によって保護されていましたが、現在はシステムのどこかに「平文で」保存されている可能性があります。それは治安が悪い。
より良いアプローチは、パートナーが HTTP 要求ヘッダーに資格情報を含むドキュメントを送信するときにパートナーを認証することです。HTTPS のみを許可する場合は、ドキュメントからパスワードを完全に取り除き、代わりにHTTP の「基本」認証ヘッダーに入れることができます。送信中は SSL によって保護され、システムに平文で保存されることはありません (認証のために一方向ハッシュのみを保存します)。
HTTP 基本認証はシンプルで広くサポートされており、SSL クライアント証明書よりも実装がはるかに簡単です。
ドキュメント コンテンツの保護
ドキュメント自体の内容が機密性の高いものである場合は、送信者が暗号化し、暗号化された形式で保存する必要があります。これを行う最善の方法は、公開鍵暗号を使用することですが、それは別の質問の主題になります。