¿Cómo puedo almacenar de forma segura las claves de cifrado en Java?

Tengo un objeto de propiedades Java con información de autenticación para un servicio web. Necesito cifrar esos datos, pero no sé dónde debo guardar la clave de cifrado para que siga siendo segura.

¿Cuáles son las mejores prácticas para cifrar estos datos y recuperarlos de forma segura?

¿Hay alguna ventaja al usar un almacén de claves?

ws_user=username ws_password=password ws_url=https://www.whatever.com/myservice 

Tu problema es común. En Linux, las contraseñas de los usuarios se almacenan en un archivo de texto sin formato. Aunque solo se almacenan los valores hash de las contraseñas, si un atacante obtiene acceso a ese archivo, no tardará mucho en descubrir alguna contraseña mediante un ataque de diccionario sin conexión. En este caso, el sistema operativo depende de los permisos de archivo para denegar el acceso a usuarios no autorizados. En tu caso, no es muy diferente. Debe configurar los permisos del archivo de contraseña correctamente y garantizar la seguridad física del servidor.

Este es un problema de huevo de gallina.
Luego deberá encontrar dónde almacenar la contraseña para el almacén de claves y demás …

Dependiendo de sus requisitos y necesidades de seguridad, puede encriptar los datos usando cifrado simétrico y recuperar la contraseña a través de un servidor remoto (su servidor) utilizando la autenticación del certificado del lado del cliente.

O puede encriptar los datos usando encriptación simétrica y tener la contraseña codificada en su jar, lo cual no es seguro, pero requiere un poco de esfuerzo para encontrarlo y puede delegar la responsabilidad a los permisos del sistema de archivos sobre quién puede acceder a sus archivos.

La conclusión es que en algún lugar debe tener la contraseña de “root-of-the-chain” en una forma no encriptada. Un archivo local protegido por el sistema operativo, un archivo remoto protegido por el sistema operativo, codificado en la fuente, etc.

La única forma de evitarlo es exigir a un humano que escriba la contraseña inicial al inicio de la aplicación, lo que obviamente no es posible para las aplicaciones que necesitan iniciarse automáticamente.

He tenido éxito usando StringEncrytor de StringEncrytor para encriptar información sensible en archivos de propiedades y algunos procedimientos internos para generar sales y recuperar la contraseña. Dado que está utilizando un servicio web, puede usar la Configuración Web PBE de Jasypt para ingresar manualmente la contraseña en el momento del despliegue o incluso rodar su propia solución similar.