¿Es compatible la generación de ID de sesión de Tomcat con FIPS?

0

Estoy intentando lograr la siguiente regla de seguridad

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

Estoy usando Tomcat 7.0.68 para mi servidor, no puedo encontrar ninguna información sobre si la generación de los ID de sesión para tomcat es compatible con FIPS.

¿Alguien sabe si el generador de ID de sesión para Tomcat es compatible con FIPS y si no, si es posible usar un generador de números aleatorios compatible con FIPS con Tomcat?

    
pregunta jgr208 16.06.2016 - 18:07
fuente

1 respuesta

2

Hay una opción de configuración FIPSMode en el APR Lifecycle Listener de Tomcat , que Parece que cumpliría tus requisitos. Como se observa en este hilo StackOverflow muy similar , y en la documentación de Tomcat / APR Lifecycle Listener, realmente se trata del modo operativo de OpenSSL. no Tomcat.

En una nota no relacionada, Tomcat no tiene certificación FIPS, debido al costo, el tiempo y la burocracia involucrados en la certificación FIPS, sin embargo, hay algunas ofertas comerciales que han probado a Tomcat con proveedores JSSE compatibles con FIPS , que pueden ser suficientes para sus propósitos. Además, Oracle y IBM ambos proporcionan documentación sobre habilitación El modo FIPS / el cumplimiento de los JSSE que proporcionan, por lo que puede no ser necesario utilizar una oferta de terceros, nuevamente, dependiendo de sus requisitos.

En la pregunta específica sobre el generador de ID de sesión de Tomcat, ya que es de código abierto, podemos verificar, y parece que el generador de ID de sesión de Tomcat utiliza la biblioteca SecureRandom de Java, que " cumple con las [...] pruebas estadísticas generadoras de números aleatorios especificadas en FIPS 140-2, Requisitos de seguridad para módulos criptográficos, sección 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;
 }

}
    
respondido por el HopelessN00b 17.06.2016 - 00:03
fuente

Lea otras preguntas en las etiquetas