Генерация пароля
Что касается кодирования пароля для передачи, единственной кодировкой, которая действительно добавит безопасность, является шифрование. Использование Base-64 или шестнадцатеричного не для безопасности, а просто для возможности включить его в текстовый формат, такой как XML.
Энтропия используется для измерения качества пароля. Таким образом, выбор каждого бита со случайным «броском монеты» даст вам пароль лучшего качества. Вы бы хотели, чтобы пароли были такими же надежными, как и другие криптографические ключи, поэтому я бы порекомендовал минимум 128 бит энтропии.
Существует два простых способа, в зависимости от того, как вы хотите закодировать пароль в виде текста (что на самом деле не имеет значения с точки зрения безопасности).
Для 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. Результирующая кодировка не такая компактная (26 символов вместо 24), и пароль не имеет такой большой энтропии. (Но 130 бит - это уже много, сравнимо с паролем, по крайней мере, из 30 символов, выбранных человеком.)
SecureRandom rnd = new SecureRandom();
/* Bit length is multiple of log2(32) = 5. */
String encoded = new BigInteger(130, rnd).toString(32);
Создание новых объектов SecureRandom требует больших вычислительных ресурсов, поэтому, если вы собираетесь часто генерировать пароли, вы можете создать один экземпляр и сохранить его.
Лучший подход
Встраивание пароля в сам XML кажется ошибкой.
Прежде всего, похоже, что вы захотите аутентифицировать отправителя перед обработкой любых документов, которые вам отправляют. Предположим, я ненавижу твои внутренности и начинаю отправлять тебе гигантские XML-файлы для выполнения атаки типа «отказ в обслуживании». Вы хотите проанализировать XML только для того, чтобы узнать, что я не являюсь законным партнером? Разве не было бы лучше, если бы сервлет просто отклонял запросы от неаутентифицированных пользователей сразу?
Во-вторых, пароли ваших законных партнеров были защищены во время передачи по протоколу HTTPS, но теперь они, вероятно, где-то хранятся в открытом виде в вашей системе. Это плохая безопасность.
Лучшим подходом будет аутентификация партнеров, когда они отправляют вам документ с учетными данными в заголовках HTTP-запроса. Если вы разрешаете только HTTPS, вы можете полностью извлечь пароль из документа и вместо этого поместить его в заголовок HTTP «Basic» аутентификации . Он защищен SSL во время передачи и не хранится в вашей системе в открытом виде (вы сохраняете односторонний хеш для аутентификации).
Базовая аутентификация HTTP проста, широко поддерживается и будет намного проще для вас и ваших партнеров, чем клиентские сертификаты SSL.
Защита содержимого документа
Если содержание самих документов является конфиденциальным, они действительно должны быть зашифрованы отправителем и сохранены вами в зашифрованном виде. Лучший способ сделать это - использовать криптографию с открытым ключом, но это будет предметом для другого вопроса.