Almacenamiento de una clave segura en la memoria de un dispositivo integrado

Estoy trabajando en un dispositivo integrado que envía/recibe datos y los almacena en modo de texto cifrado (modo cifrado). Ahora, ¿cuál es el mejor enfoque para almacenar claves (utilicé MCU de la serie ARM CORTEX M)?

1-Almacenamiento de claves en la memoria SRAM y en cada secuencia de arranque, inyecte claves en la MCU integrada y guárdelas en la memoria SRAM. Creo que es la mejor manera, entonces cuando MCU detecta la penetración (con sensor de manipulación o ...) puede borrar SRAM rápidamente y reiniciarse. Desventaja: si el atacante logra pasar las manipulaciones y acceder al dispositivo, qué tan segura es la memoria SRAM (contra la minería de código). No puedo encontrar ninguna capacidad de seguridad para esta memoria en MCU.

2-Generar claves y almacenarlas en la memoria flash en programación MCU. La memoria flash MCU admite CRP (protección de lectura de código) que evita la extracción de código y, con la ayuda de su motor AES interno y su motor RNG (generación de números aleatorios), podemos crear una clave aleatoria y cifrar la memoria flash y almacenar esa clave aleatoria en la OTP ( memoria programable de una sola vez: una memoria cifrada de 128 bits), luego, en la ejecución del código, decodificamos la memoria flash con la clave RNG y accedemos a la clave y los códigos iniciales. Desventaja: las claves se almacenan en una memoria no volátil, las manipulaciones serán inútiles y el atacante tendrá mucho tiempo para extraer claves.

3-Clave almacenada en la memoria EEPROM, combinación de las 2 anteriores, clave almacenada en la memoria no volátil, pero cuando las manipulaciones detectan la penetración, la EEPROM se puede borrar.

Considero LPC18S57FBD208 (cortex m3 con 1 MB de memoria flash, 180 MHz, 136 KB de SRAM, 16 KB de EEPROM y un controlador TFT LCD que necesito para manejar un TFT LCD de 7" y un motor criptográfico AES de 128 bits) para eso, ¿hay alguna otra sugerencia mejor?

Respuestas (1)

Ninguna de esas opciones es particularmente mejor o peor que las demás, porque todas son muy inseguras. Voy con la opción 4.

  1. SRAM es el lugar más seguro para almacenar claves, pero nunca debe inyectarlas desde el mundo exterior. SIEMPRE deben generarse dentro del procesador, durante el arranque. Hacer cualquier otra cosa invalida instantáneamente el resto: es automáticamente inseguro.

  2. No almacene claves en la memoria no volátil, tiene razón en esto. No importa si protege la EEPROM o la memoria flash para que no se lea. Ese fusible de protección de lectura de código se invierte fácilmente. Un atacante solo necesita destapar (quitar o grabar químicamente el empaque de epoxi negro para exponer el troquel de silicona en el interior). En este punto, pueden cubrir la parte del troquel que son células de memoria no volátiles (estas secciones son muy regulares y aunque las células de memoria individuales son demasiado pequeñas para ser vistas, la estructura más grande puede serlo) y una pequeña pieza de algo. opaco a los rayos UV está enmascarado sobre esa sección. Luego, el atacante puede hacer brillar una luz ultravioleta en el chip durante 5 a 10 minutos y restablecer todos los fusibles, incluido el fusible CRP. La memoria OTP ahora puede ser leída por cualquier programador estándar.

O, si están bien financiados (digamos, obtener esas claves vale más de $ 1000 para alguien), pueden simplemente leer las celdas de memoria directamente con varios tipos de microscopios electrónicos.

Para estar seguras, las claves deben borrarse, no ocultarse.

  1. No, por las mismas razones anteriores.

Ahora, a la opción 4:

  1. Solo usa encriptación. La distribución de claves es un problema resuelto. Así que use esa solución fácilmente disponible. El chip debe usar su RNG y se deben hacer varias otras consideraciones para garantizar que tenga un suministro suficiente de entropía disponible, y el cargador de arranque debe iniciarse directamente en el programa que genera la(s) clave(s) secreta(s) necesaria(s), que debe ser de uso general se registran y se mueven directamente a SRAM, donde permanecerán hasta que se borren.

Sin embargo, hay un problema, que es que nada, excepto la CPU, tiene idea de cuál es la clave secreta. No hay problema: utilice criptografía de clave pública. Lo que SÍ tiene almacenado en la memoria OTP es su clave pública. Cualquiera puede leer esta clave, puede publicarla en el intercambio de pilas, puede pintarla en el costado de un petrolero en letras de 5 pies de alto, no importa. Lo maravilloso de la criptografía de clave pública es que es asimétrica. La clave para cifrar algo no puede descifrarlo, eso requiere la clave privada. Y a la inversa, la clave para descifrar algo cifrado por la clave pública no se puede usar para cifrar algo. Entonces, la CPU genera las claves secretas, usa su clave pública almacenada para CIFRAR las claves secretas y simplemente las envía a través de USB o RS232 o lo que desee. Leer la clave secreta requiere su clave privada, que no necesitan ser almacenados, enviados o involucrados en absoluto con el chip. Una vez que haya descifrado la clave secreta con su clave privada (en otro lugar, fuera del chip), estará listo. Tiene una clave secreta transmitida de forma segura que se GENERÓ completamente dentro del chip, sin tener que almacenar nada excepto una clave pública, que, como se indicó anteriormente, no necesita estar protegida en absoluto para que no se pueda leer.

Este proceso se denomina formalmente negociación clave, y todo lo utiliza. Lo has usado varias veces hoy. Hay muchos recursos y bibliotecas disponibles para manejarlo. Por favor, nunca 'inyecte' claves en nada.

Una última cosa para mencionar: todo esto es discutible porque la clave AES se puede recuperar fácilmente mediante ataques de canal lateral, que se ubican en la fuente de alimentación y miden cambios mínimos en el consumo de corriente y el tiempo entre esos cambios causados ​​por cambios de bits en la CPU. como registros. Esto, combinado con el conocimiento de cómo funciona AES (o cualquiera que sea el conjunto muy pequeño de posibles algoritmos de encriptación que podrían usarse), hace que sea relativamente fácil y económico recuperar la clave. No permitirá leer la clave, pero puede reducir el espacio de la clave a algo ridículamente pequeño, como 255 claves posibles. El chip tampoco puede detectarlo, ya que está aguas arriba.

Esto ha derrotado a los cargadores de arranque cifrados AES-256 en procesadores criptográficos 'seguros' y ni siquiera es tan difícil. Hasta donde yo sé, no existen verdaderas contramedidas de hardware para este ataque. Sin embargo, son los algoritmos de encriptación en sí mismos, y cómo requieren una CPU para voltear bits, lo que está causando esta vulnerabilidad. Sospecho que será necesario (y con suerte se están) desarrollando algoritmos resistentes al canal lateral oa prueba del canal lateral.

Entonces, tal como está ahora, la respuesta real a cómo almacenar una clave (o incluso usar una clave temporal) en un dispositivo integrado de forma segura es: no puede.

Pero al menos si genera una nueva clave cada vez que usa la negociación de claves en la opción 4, entonces un ataque de canal lateral solo puede comprometer la clave de un canal en uso, y solo si tienen un tiempo para monitorear la energía mientras cifra los datos. . Si negocia con frecuencia nuevas claves generadas internamente, esto puede proporcionar cantidades útiles de seguridad.

Genere claves y guárdelas durante el menor tiempo posible.

Realmente gracias querido Metacollin por aclararme. Pero mi proyecto consta de muchos lectores (contiene mcu) y muchos MCU objetivo. Cada lector debe poder leer cualquiera de los objetivos y cualquiera de los objetivos debe poder ser leído por cualquiera de los lectores. Porque de esto creo que deben estar de acuerdo con una clave única para transportar datos. y según su respuesta, creo que no hay tantas diferencias entre, por ejemplo, LPC18S57 Secure Cortex M3 y STM32F429 General Cortex M4 e incluso LPC1788 General Cortex M3 (opción más barata), no estoy haciendo un proyecto de alto secreto, pero quiero hacerlo. esto tan seguro como puedo.
Su declaración de que "la clave AES se puede recuperar fácilmente" es al menos cuestionable. Entiendo el principio detrás de la técnica de averiguar qué sucede en el procesador, en función de su consumo actual. Sin embargo, asume que el cifrado y el descifrado es lo único en lo que está trabajando la CPU. Sin embargo, la mayoría de las aplicaciones tienen solo 1 CPU que trabaja en un montón de tareas al mismo tiempo. Durante un bloque de cifrado AES, pueden ocurrir decenas o cientos de interrupciones, lo que hace que sea imposible encontrar la clave, según los picos actuales.
Si la clave no debe almacenarse en flash, lo mismo ocurre con el código que genera la clave ... solo tiene que traducir los códigos de operación al ensamblador y luego tiene la clave, sin importar cuán intrincado sea el código.
The wonderful thing about private key cryptography is that it is asymmetric.Aunque está claro en su publicación que sabe esto, lo mencionaré para otros lectores... s/private/public en la cita anterior.
Es posible que pueda proteger un canal entre dos dispositivos cualquiera mediante el método 4; sin embargo, sin tener algún tipo de secreto compartido, no puede garantizar la autenticidad del dispositivo con el que se está comunicando. Si su caso de uso requiere autenticación, no está mejor con un intercambio de claves que si simplemente está almacenando un único secreto compartido en flash. Si necesita una mayor seguridad, debe usar un chip criptográfico.