Hay muchas maneras de hacer esto.
Yo cifraría el JSON en un nivel de archivo completo en lugar de cifrar el contenido dentro de él. La alternativa es complicada y no proporciona ninguna ventaja de seguridad significativa. Recomiendo usar un cifrado AEAD (mi recomendación actual es AES-256 con GCM: también conocido como AES / GCM / NoPadding con claves de 256 bits). Para usar GCM necesitas estar en Java 8 o posterior. Para utilizar AES-256 con un JRE de Oracle, necesitará la Extensión de criptografía de Java (JCE ) Archivos de política de jurisdicción de fuerza ilimitada instalados como se documenta.
Debe asegurarse de configurar la etiqueta de autenticación para que incluya información sobre la ubicación y el uso (el verdadero nombre de archivo es un buen comienzo) para dificultar el cambio de nombre o la sustitución por otras versiones (una forma de ataque de repetición en reposo).
Sin embargo, cifrar el contenido JSON no es una solución completa. Solo mueve la pelota un poco. Si el atacante aún tiene acceso de texto simple a la clave privada, entonces no será efectivo.
Para proteger el texto plano de la clave privada, puede usar un KMS (Servicio de administración de claves) en un sistema separado. Eso mantiene la clave privada fuera del acceso a la memoria en la máquina con el archivo JSON cifrado. Usted envía el contenido del archivo cifrado al KMS para ser descifrado en la carga o viceversa en la tienda.
Con los implementados, puede proteger el archivo de forma efectiva contra ataques fuera de línea (por ejemplo, análisis de imagen de disco, análisis de imagen de máquina, robo de copia de seguridad, robo de medios). Sin más defensas, el contenido del archivo aún está sujeto a ataques en línea de la memoria de la máquina.