Seguridad de la aplicación de claves criptográficas

0

¿Hay una manera de asegurar un byte[] , PrivateKey , PublicKey , KeyPair y SecretKey en una aplicación para que un malware no pueda recuperar la clave analizando la memoria? O al menos, ¿cómo endurecerlo para que sea más difícil recuperar las claves efímeras (no hay "protección" utilizando claves codificadas)?

¿O es casi un "goner" si el atacante tiene acceso al dispositivo?

El lenguaje es Java, así que supongamos que el atacante tiene pleno conocimiento del código fuente.

Sin usar HSM y otros dispositivos similares.

    
pregunta user3635998 22.03.2016 - 13:45
fuente

1 respuesta

2

No puede protegerse contra su host, ya sea el sistema operativo, el procesador o el BIOS.
También vea las Leyes # 1 y # 2 de Seguridad.

Sin embargo, esto no significa que no hay forma de defenderse contra al menos algunos ataques de software. Sin embargo, tenga en cuenta: Si realmente desea proteger la clave, debe utilizar tecnologías aplicadas por hardware como HSMs , TPMs , tarjetas inteligentes y SGX . Los primeros dos métodos que describiré son básicos y los realiza cualquier biblioteca criptográfica algo decente, los últimos son más exóticos.

Defensa # 1: ¡Siempre limpia detrás de ti!

En general, se considera la mejor práctica limpiar siempre el desorden que cree en los programas. Esto también se aplica a la ingeniería de seguridad y, por lo tanto, debería poner a cero de manera confiable todas las claves cuando ya no las necesite . Tenga en cuenta que un simple estilo C memset(pointer,0,size); no hará el truco porque el compilador seguramente lo optimizará, debe usar funciones dedicadas para grabar sus claves en la memoria (Windows las ofrece y puede escribirlas usted mismo en ensamblador o como un simple bucle).

Defensa # 2: ¡Nunca dejes de mirar tus llaves!

Los sistemas operativos modernos comúnmente se envían con una función llamada "swap-memory", que es ideal para los desarrolladores de aplicaciones, ya que puede aumentar el tamaño de la RAM cuando sea necesario al intercambiar páginas en el disco duro. Sin embargo, esto es realmente malo para la seguridad, ya que limpiar las teclas después de que se hayan intercambiado tiende a ser bastante difícil y, por lo tanto, debe indicar a su sistema operativo que realice una llamada de función adecuada para mantener siempre sus teclas en la memoria RAM (física y efímera) .

Las siguientes defensas son más avanzadas y es menos probable que se implementen en cualquier lugar. Sin embargo, se enumeran en Schneier's Cryptography Engineering y puede defenderlo en algunas circunstancias. Deje que sombrerería de papel de aluminio comience!

Defensa # 3: ¡Cifra todas las cosas!

Es posible que hayas oído hablar de "ataques de arranque en frío". Básicamente, son el escenario (improbable) de que un atacante pueda tomar posesión de su máquina, enfriarla (más o menos) y extraer las claves criptográficas secretas durante varios segundos o incluso horas. Es muy difícil defenderse contra tales ataques (que también incluyen volcados de memoria (automáticos)). Por eso se inventó el Boojum (¡este es el nombre real!).

Supongamos que tiene claves secretas k,l,m,n , cada una de 128 bits de longitud. Ahora crea otra clave secreta i , que utiliza para cifrar AES k,l,m,n en modo CTR o GCM (la autenticación no importa demasiado aquí). Ahora, cuando necesite k,l,m,n , simplemente descifre AES y lo use y lo volverá a cifrar o borrará la copia temporal. La pregunta ahora se convierte en "¿Cómo proteger i ?" Con Boojum , creará una cadena aleatoria R en la RAM en una ubicación de memoria físicamente distante que i . Usted hash R y XOR con i y lo almacena. Cuando necesites i , hash R otra vez y lo XOR con el valor almacenado para recuperarlo. Por supuesto, esto no es demasiado seguro si mantiene R el mismo todo el tiempo, ya que la RAM eventualmente "aprenderá" el valor y lo mantendrá más tiempo, por lo que debe actualizar este a menudo . Lo actualiza, (opcionalmente) seleccionando una nueva ubicación de memoria y generando un nuevo R' y almacenando R' XOR R en la (nueva) ubicación en la memoria. Ahora desenmascara i usando el hash de R y hash el "nuevo" R y la máscara i nuevamente. Por supuesto que borras el antiguo R . Se recomienda repetir este proceso de actualización con frecuencia , por ejemplo. cada segundo.

    
respondido por el SEJPM 23.03.2016 - 17:10
fuente

Lea otras preguntas en las etiquetas