La generazione dell'ID sessione Tomcat è conforme a FIPS?

0

Sto cercando di raggiungere la seguente regola di sicurezza

server must generate a unique session identifier using a FIPS 140-2 approved random number generator.

Sto utilizzando Tomcat 7.0.68 per il mio server, non sono in grado di trovare alcuna informazione se la generazione degli ID di sessione per tomcat è conforme a FIPS.

Qualcuno sa se il generatore di ID sessione per Tomcat è conforme a FIPS e, in caso contrario, se è possibile utilizzare un generatore di numeri casuali conforme a FIPS con Tomcat?

    
posta jgr208 16.06.2016 - 18:07
fonte

1 risposta

2

Esiste un'opzione di configurazione FIPSMode nel listener del ciclo di vita APR di Tomcat , che sembra che soddisfi le tue esigenze. Come osservato in questo thread StackOverflow molto simile e nella documentazione di Lifecycle Listener di Tomcat / APR, si tratta davvero della modalità operativa di OpenSSL, non Tomcat.

Su una nota non correlata, Tomcat non è certificato FIPS, a causa del costo, del tempo e della burocrazia coinvolti nella certificazione FIPS, tuttavia ci sono alcune offerte commerciali che hanno testato Tomcat con provider JSSE conformi ai FIPS , che potrebbero essere sufficienti per i tuoi scopi. Inoltre, Oracle e IBM entrambi forniscono documentazione sull'abilitazione Modalità FIPS / conformità con le JSSE che forniscono, quindi potrebbe non essere necessario utilizzare un'offerta di terze parti, ancora una volta, a seconda dei requisiti.

Sulla domanda specifica sul generatore di ID sessione di Tomcat, dato che è open source, possiamo controllare, e sembra che il generatore SessionID di Tomcat utilizzi la libreria SecureRandom di Java, che " [...] è conforme ai test del generatore di numeri casuali statistici specificati in FIPS 140-2, Requisiti di sicurezza per i moduli crittografici, sezione 4.9.1. "

public class SessionIdGenerator {

/**
 * Generate and return a new session identifier.
 */
public String generateSessionId() {
byte random[] = new byte[16];
// Render the result as a String of hexadecimal digits
StringBuilder buffer = new StringBuilder();
int resultLenBytes = 0;

while (resultLenBytes < sessionIdLength) {
getRandomBytes(random);
for (int j = 0; j < random.length && resultLenBytes < sessionIdLength; j++) {
byte b1 = (byte) ((random[j] & 0xf0) >> 4);
byte b2 = (byte) (random[j] & 0x0f);

if (b1 < 10) buffer.append((char) ('0' + b1));
else buffer.append((char) ('A' + (b1 - 10)));

if (b2 < 10) buffer.append((char) ('0' + b2));
else buffer.append((char) ('A' + (b2 - 10)));

resultLenBytes++;
 }
 }

if (jvmRoute != null && jvmRoute.length() > 0) {
 buffer.append('.').append(jvmRoute);
 }

return buffer.toString();
 }

/**
 *
 */
 private void getRandomBytes(byte bytes[]) {
SecureRandom random = randoms.poll();
 if (random == null) {
 random = createSecureRandom();
 }
 random.nextBytes(bytes);
 randoms.add(random);
 }

 /**
 * Create a new random number generator instance we should use for
 * generating session identifiers.
 */
 private SecureRandom createSecureRandom() {

SecureRandom result = null;

long t1 = System.currentTimeMillis();
 if (secureRandomClass != null) {
 try {
 // Construct and seed a new random number generator
 Class<?> clazz = Class.forName(secureRandomClass);
 result = (SecureRandom) clazz.newInstance();
 } catch (Exception e) {
 log.error(sm.getString("sessionIdGenerator.random",
 secureRandomClass), e);
 }
 }

if (result == null) {
 // No secureRandomClass or creation failed. Use SecureRandom.
 try {
 if (secureRandomProvider != null &&
 secureRandomProvider.length() > 0) {
 result = SecureRandom.getInstance(secureRandomAlgorithm,
 secureRandomProvider);
 } else if (secureRandomAlgorithm != null &&
 secureRandomAlgorithm.length() > 0) {
 result = SecureRandom.getInstance(secureRandomAlgorithm);
 }
 } catch (NoSuchAlgorithmException e) {
 log.error(sm.getString("sessionIdGenerator.randomAlgorithm",
 secureRandomAlgorithm), e);
 } catch (NoSuchProviderException e) {
 log.error(sm.getString("sessionIdGenerator.randomProvider",
 secureRandomProvider), e);
 }
 }

if (result == null) {
 // Invalid provider / algorithm
 try {
 result = SecureRandom.getInstance("SHA1PRNG");
 } catch (NoSuchAlgorithmException e) {
 log.error(sm.getString("sessionIdGenerator.randomAlgorithm",
 secureRandomAlgorithm), e);
 }
 }

if (result == null) {
 // Nothing works - use platform default
 result = new SecureRandom();
 }

// Force seeding to take place
 result.nextInt();

long t2 = System.currentTimeMillis();
 if ((t2 - t1) > 100)
 log.info(sm.getString("sessionIdGenerator.createRandom",
 result.getAlgorithm(), Long.valueOf(t2 - t1)));
 return result;
 }

}
    
risposta data 17.06.2016 - 00:03
fonte

Leggi altre domande sui tag