Técnicamente, el término "firma" está reservado para, bueno, las firmas y las funciones hash no las calculan.
Para garantizar que los datos no se alteraron durante el tránsito, con una función hash, entonces debe tener una forma segura fuera de banda de transmitir el valor hash; no se puede agregar el valor hash dentro de los encabezados HTTP, ya que cualquiera que pueda alterar los datos transmitidos puede volver a calcular el hash a voluntad y modificar los encabezados HTTP como lo considere oportuno.
Con la criptografía, puede "concentrar" esa transmisión segura fuera de banda en una clave reutilizable. Si el cliente y el servidor tienen un valor secreto compartido, desconocido para el supuesto atacante, entonces el acrónimo es MAC, como en "Código de autenticación de mensaje"; un MAC habitual es HMAC.
En muchas situaciones prácticas, no se puede usar un MAC, porque un MAC requiere un secreto compartido, y un secreto que se comparte demasiadas veces ya no es realmente secreto. Cada titular secreto tiene el poder de recalcular MAC. Si cada cliente conoce el secreto, básicamente no es un secreto y es seguro asumir que el atacante también lo sabe. Por lo tanto, puede ir un paso más allá y utilizar las firmas digitales (las reales, aquellas que usan RSA, DSS, ECDSA ...) en las que el servidor usa una clave privada (que solo el servidor conoce) y los clientes saber solamente de la clave pública correspondiente. El conocimiento de la clave pública es suficiente para verificar firmas, pero no para producir nuevas, y la clave privada no puede ser recalculada desde la clave pública (aunque están matemáticamente vinculadas entre sí).Sin embargo, implementar una firma digital y usarla adecuadamente es mucho más difícil de lo que normalmente se supone; su mejor opción es usar un protocolo ya depurado, con implementaciones existentes, y ese protocolo se llama "SSL".
El punto aquí es que sin SSL, es probable que lo que haga no disuada a un atacante determinado; solo usará ciclos de CPU y ancho de banda de red, y le dará una sensación cálida y difusa.
@Pablo: ¿También necesita firmar los encabezados? – Thilo
@Thilo solo el contenido estaría bien –
@BalusC aún no sé si ese es el enfoque que voy a tomar, pero esa clase 'HttpServletResponseWrapper' es __NICE__ (+1) –