2015-04-20 42 views
2

我需要生成隨機 32個字符的字符串與使用SecureRandom類。我試圖與產生32字節數組然後使用Base64編碼:在我的情況下生成隨機字符

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

new String(Base64.encodeBase64(bytes)); 

但這代碼產生具有超過32個字符的字符串。如何在使用SecureRandom類的同時獲得32個隨機字符?

+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

Base64附加N個字符的規則是什麼?你怎麼知道24字節編碼結果32個字符? – user842225

+3

Base64使用64 = 2^6「數字」 - 因此每字節/字符有6位有效載荷。 4個字符完全可以滿足3個字節。因此,32個字符的Base64將具有完全24字節的有效載荷。 –

0

我們可以使用單行代碼實現此目的。使用org.apache.commons.lang.RandomStringUtilscommons-lang庫。

代碼:

RandomStringUtils.randomAlphabetic(32);