Estoy creando una aplicación en la que ciertos archivos confidenciales deben estar firmados digitalmente antes de ser almacenados en el sistema de archivos utilizando la codificación ASN.1, para que puedan verificarse con un certificado digital (el correspondiente a la clave privada utilizada para firmando) en un momento posterior cuando son accedidos. Estoy usando la biblioteca Bouncy Castle para Java.
Hay un desacuerdo entre los miembros de mi equipo con respecto al mejor lugar para almacenar el certificado digital, y me gustaría saber cuál es la mejor práctica:
- Almacenar el contenido del archivo, la firma y el certificado empaquetados juntos en un CMSSignedData objeto. De esta manera, el procedimiento de verificación solo necesita recibir el objeto CMSSignedData, ya que todos los datos necesarios para realizar la verificación están presentes en un solo objeto.
- Almacenar solo la firma y el contenido del archivo en un CMSSignedData, y almacenar el certificado en otro lugar. Usando este enfoque, se necesita algo de trabajo extra para administrar el certificado y relacionar cada archivo firmado con el certificado necesario para realizar la verificación.
Me preocupa el primer enfoque, creo que alguien podría empaquetar y guardar el contenido del archivo, un certificado diferente del mío y una firma generada con la clave privada correspondiente a ese certificado, y la verificación tendrá éxito, porque la El procedimiento de verificación no recibió el certificado "original", sino uno falso.
¿Qué recomiendas? ¿Ve alguna deficiencia o problemas potenciales en alguna de las alternativas mencionadas anteriormente? ¿Cuál es la mejor práctica o debo utilizar un enfoque completamente diferente?