La mejor práctica para administrar las claves privadas / secretas en la memoria es usar una memoria físicamente fuera del alcance de los atacantes, como un HSM, una tarjeta inteligente, un módulo de plataforma confiable o un elemento seguro.
El problema es que es hardware, y en las máquinas modernas (servidores, nube, PC, dispositivos móviles), el hardware confiable no es fácil de usar (aunque a menudo está presente; en particular, veo un renovado interés por TPM 2.0 en el servidor / nube).
Las opciones de solo software son un compromiso. Una razonable para
- Confíe en el hardware + SO para mantener al menos el contenido de la memoria de un proceso privado, y mantener las claves privadas / secretas es un proceso separado haciendo el cifrado, intercambiando mensajes con el proceso usando el crypto.
-
Y se adhieren a los algoritmos que tienen una protección inherente contra las fugas de procesos laterales / procesos cruzados, porque los ataques en este frente son numerosos. Libsodium es una buena opción desde este punto de vista.
La combinación al menos hace que una filtración de una clave privada / secreta sea improbable como resultado de vulnerabilidades en el proceso mediante el uso de la criptografía (debido a errores prácticamente inevitables en la pila de software inmanejablemente compleja involucrada en una aplicación típica). Un inconveniente es que el acceso al proceso que realiza la criptografía debe administrarse de forma segura (por ejemplo, a través de los derechos de acceso aplicados por el sistema operativo), lo que agrega complejidad.
Una forma de ver los llamados "enclaves" es como una implementación estandarizada de ese principio de diseño.
Mi opinión sobre el tema de multiplicar el secreto frente al uso de punteros a un área centralizada es que es secundario desde el punto de vista de la seguridad, en comparación con el aislamiento del proceso. Tiendo a preferir los punteros, no tanto porque es un poco más eficiente, sino porque evita la molestia de tener que cero copias que ya no están en uso para seguir las pautas que lo requieren. Considero que la reducción a cero no es esencial técnicamente (nuevamente, en comparación con el aislamiento del proceso); pero me gusta usar e > 2 16 en RSA, es algo para inclinarse.