Estoy escribiendo una aplicación T1 que utiliza la base de datos SQLite para almacenar algunos datos confidenciales y estoy intentando cifrarla de forma segura. El problema al que me enfrento es que no quiero que mi clave simétrica se almacene en la memoria, ya que en ese caso, cualquier otro proceso puede tomar una instantánea de la memoria y acceder a mis claves. He mirado muchas posibles preguntas similares:
CryptProtectMemory / CryptProtectdata
Pero el problema con esto es que tiene dos opciones diferentes -
CRYPTPROTECTMEMORY_SAME_PROCESS or CRYPTPROTECTMEMORY_CROSS_PROCESS
El problema con CRYPTPROTECTMEMORY_SAME_PROCESS es que restringe el acceso a un proceso en particular (y mi aplicación tiene un proceso de IU separado que también podría acceder a la base de datos) y el problema con CRYPTPROTECTMEMORY_CROSS_PROCESS es que permite que todos los procesos del usuario registrado para acceder a estos datos, que tipo de derrota el propósito
Entonces, lo que quiero es una API donde pueda especificar solo un grupo de procesos que pueden acceder a mis datos / clave
Miré opciones similares pero nada es aplicable en mi caso:
- Usar DPAPI : esto vincula la clave de cifrado al inicio de sesión de su administrador, pero el problema es que No confío en el usuario actualmente registrado. De hecho, quiero ocultar esto a cualquier persona que no sea T1 y mi proceso de UI. Entiendo que puedo agregar entropía secundaria para restringir el acceso del usuario registrado a la información. Sin embargo, necesito almacenar estos datos secretos en la máquina. ¿Cómo puedo proteger eso? ... Parece ser un problema recursivo.
- Hardware externo o almacenamiento de la clave en un servidor remoto: como la aplicación se implementará en muchos puntos finales comerciales (que pueden no tener el hardware específico) y también debe funcionar en modo fuera de línea (es posible que no se pueda acceder al servidor) .
- Almacene la clave en la base de datos. Necesito proteger la base de datos, lo cual es un poco recursivo en mi caso nuevamente.