2015-04-20 2 views
2

Мне нужно сгенерировать random 32 символа строка с использованием SecureRandom класс. Я попытался с производящими 32 байтовый массив затем использовать кодировку Base64:генерировать случайные символы в моем случае

byte[] bytes = new byte[32]; 
new SecureRandom().nextBytes(bytes); 

new String(Base64.encodeBase64(bytes)); 

Но этот код генерирует строку с более чем 32 символов. Как я могу получить случайные 32 символа, все еще используя класс SecureRandom?

+0

Вам необходимо 32 и ваш код генерирует более чем 32, почему вы не можете подобрать первые 32? Это все равно будет случайным ... – alainlompo

ответ

1

Попробуйте вместо этого закодировать от 22 до 24 байтов.

При кодировании этой суммы результирующая строка в кодировке Base64 должна содержать ровно 32 символа, хотя некоторые из них могут быть = меток на основе того, являются ли его 22 или 23 байта из-за заполнения.

Если вы не хотите отметки =, просто кодируйте 24 байта, и никакие дополнения не будут добавлены.

Если вас больше интересует, как работает прокладка или кодировка Base64, то текущий wikipedia article довольно подробно.

например. измените свой код соответствующим образом:

byte[] bytes = new byte[24]; 
new SecureRandom().nextBytes(bytes); 

new String(Base64.encodeBase64(bytes)); // Should be 32 characters in length. 
+0

Каково правило добавления N символов в Base64? Как вы знаете, 24 байт кодирует результаты 32 символа? – user842225

+3

Base64 использует 64 = 2^6 "цифр" - следовательно, имеет 6 бит полезной нагрузки на байт/символ. 4 символа достаточно для 3 байтов. Таким образом, 32 символа Base64 будут иметь полезную нагрузку ровно 24 байта. –

0

Мы можем достичь этого, используя одну строку кода. Используйте org.apache.commons.lang.RandomStringUtils от commons-lang библиотеки.

Код:

RandomStringUtils.randomAlphabetic(32); 
Смежные вопросы