まず、java.security.SecureRandomを用いてランダムなバイト列を生成します。

byte bytes[] = new byte[16];
SecureRandom secRandom = SecureRandom.getInstance("SHA1PRNG");
secRandom.nextBytes(bytes);

二行目で乱数を生成するインスタンスを作成し、その後三行目を繰り返すことでbytesの中に繰り返しランダムなバイト列が格納される事になります。

その後、

StringBuffer buf = new StringBuffer();
for (int i = 0; i < bytes.length; i++) {
    buf.append(String.format("%02x", bytes[i]));
}

と書くことで、16進数の文字列に変更できます。

ちなみに、これはCSRFと同じ仕組みらしいです。

(参考文献):https://www.websec-room.com/2013/03/05/438

関連記事