A classe Java SecureRandom
1. Introdução
Neste breve tutorial, aprenderemos sobrejava.security.SecureRandom, uma classe que fornece um gerador de números aleatórios criptograficamente forte.
2. Comparação comjava.util.Random
Implementações JDK padrão dejava.util.Random usam um algoritmoLinear Congruential Generator (LCG) para fornecer números aleatórios. O problema com esse algoritmo é que ele não é criptograficamente forte. Em outras palavras, os valores gerados são muito mais previsíveis; portanto, os invasores podem usá-lo para comprometer nosso sistema.
Para superar esse problema, devemosuse java.security.SecureRandom in any security decisions. Ele produz valores aleatórios criptograficamente fortes usandocryptographically strong pseudo-random number generator (CSPRNG).
Para uma melhor compreensão da diferença entre LCG e CSPRNG, consulte o gráfico abaixo, apresentando uma distribuição de valores para os dois algoritmos:
3. Gerando valores aleatórios
A maneira mais comum de usarSecureRandom égenerate int, long, float, double or boolean values:
int randomInt = secureRandom.nextInt();
long randomLong = secureRandom.nextLong();
float randomFloat = secureRandom.nextFloat();
double randomDouble = secureRandom.nextDouble();
boolean randomBoolean = secureRandom.nextBoolean();
Para gerar os valoresint, podemos passar um limite superior como parâmetro:
int randomInt = secureRandom.nextInt(upperBound);
Além disso, podemosgenerate a stream of values paraint,double elong:
IntStream randomIntStream = secureRandom.ints();
LongStream randomLongStream = secureRandom.longs();
DoubleStream randomDoubleStream = secureRandom.doubles();
Para todos os fluxos, podemos definir explicitamente o tamanho do fluxo:
IntStream intStream = secureRandom.ints(streamSize);
e os valores de origem (inclusive) e vinculados (exclusivos):
IntStream intStream = secureRandom.ints(streamSize, originValue, boundValue);
Também podemos gerar umsequence of random bytes. A funçãonextBytes() pega a matrizbyte fornecida pelo usuário e a preenche combytes aleatório:
byte[] values = new byte[124];
secureRandom.nextBytes(values);
4. Escolhendo um algoritmo
By default, SecureRandom uses the SHA1PRNG algorithm para gerar valores aleatórios. Podemos fazê-lo usar explicitamente outro algoritmo invocando o métodogetInstance():
SecureRandom secureRandom = SecureRandom.getInstance("NativePRNG");
CriarSecureRandom com o operadornew é equivalente aSecureRandom.getInstance(“SHA1PRNG”).
Todos os geradores de números aleatórios disponíveis em Java podem ser encontradoson the official docs page.
5. Sementes
Cada instância deSecureRandom é criada com uma semente inicial. Ele funciona como base para fornecer valores aleatórios e alterações toda vez que geramos um novo valor.
Usar o operadornew ou chamarSecureRandom.getInstance() seráget the default seed from /dev/urandom.
Podemos mudar a semente passando-a como um parâmetro construtor:
byte[] seed = getSecureRandomSeed();
SecureRandom secureRandom = new SecureRandom(seed);
ou invocando um método setter no objeto já criado:
byte[] seed = getSecureRandomSeed();
secureRandom.setSeed(seed);
Lembre-se de que se criarmos duas instâncias deSecureRandom com a mesma semente, e a mesma sequência de chamadas de método for feita para cada uma, elas serãogenerate and return identical sequences of numbers.
6. Conclusão
Neste tutorial, aprendemos como funciona oSecureRandom e como usá-lo para gerar valores aleatórios.
Como sempre, todo o código apresentado neste tutorial pode ser encontradoover on GitHub.