package com.trilead.ssh2;
import java.security.NoSuchAlgorithmException;
import java.security.SecureRandom;
/**
* Creates {@link SecureRandom}
*
* @author Kohsuke Kawaguchi
*/
class RandomFactory {
static SecureRandom create() {
try {
// JENKINS-20108
// on Unix, "new SecureRandom()" uses NativePRNG that uses a VM-wide lock, which results in
// SecureRandom.nextInt() contention when there are lots of concurrent connections.
// SHA1PRNG avoids this problem. This PRNG still gets seeded from (blocking) /dev/random,
// which assures security.
//
// note that SHA1PRNG is not a standard. See http://security.stackexchange.com/questions/47871/
//
// there's also http://coding.tocea.com/scertify-code/dont-use-the-sha1-prng-randomness-generator/
// which claims SHA1PRNG has "statistical defects" without details. I discount the credibility of
// this claim based on the lack of details, and that this is not reported as a vulnerability upstream.
return SecureRandom.getInstance("SHA1PRNG");
} catch (NoSuchAlgorithmException e) {
// fall back
return new SecureRandom();
}
}
}