Armazenando uma chave segura na memória de um dispositivo incorporado

10

Estou trabalhando em um dispositivo incorporado que envia / recebe dados e os armazena no modo de texto cifrado (modo criptografado). Agora, qual é a melhor abordagem para armazenar chaves (usei o MCU da série ARM CORTEX M)?

1-Armazenando chaves na memória SRAM e em cada sequência de inicialização, injete chaves no MCU incorporado e as armazene na memória SRAM. É a melhor maneira que penso, quando o MCU detecta a penetração (com sensor de violação ou ...) ele pode apagar a SRAM rapidamente e se redefinir. Desvantagem: se o invasor obtiver sucesso em passar interferências e acessar o dispositivo, quão segura é a memória SRAM (contra a mineração de código). Não consigo encontrar nenhuma capacidade de segurança para essa memória nas MCUs.

2-Gere chaves e as armazene na memória flash na programação do MCU. O suporte a memória flash MCU CRP (proteção de leitura de código) que impede a mineração de código e, com o auxílio de seu mecanismo AES interno e do mecanismo RNG (geração de números aleatórios), podemos criar uma chave aleatória e criptografar a memória flash e armazenar essa chave aleatória no OTP ( memória programável única - uma memória criptografada de 128 bits); em seguida, na execução do código, decodificamos a memória flash com a chave RNG e acessamos a chave e os códigos iniciais. Desvantagem: as chaves armazenadas em uma memória não volátil, os adulteradores serão inúteis e o invasor terá muito tempo para extrair as chaves.

Chave armazenada na memória EEPROM, combinação das duas abordagens acima, chave armazenada na memória não volátil, mas quando se altera a penetração da detecção, a EEPROM é apagável.

Eu considero o LPC18S57FBD208 (córtex m3 com 1MB de memória flash, 180MHZ, 136KB SRAM, 16KB EEPROM e um controlador TFT LCD que eu preciso para dirigir um mecanismo de criptografia TFT LCD de 7 "e AES de 128 bits), pois existe outra sugestão melhor?

Mahmoud Hosseinipour
fonte

Respostas:

18

Nenhuma dessas opções é particularmente melhor ou pior que as outras, porque são todas muito inseguras. Vou com a opção 4.

  1. A SRAM é o local mais seguro para armazenar chaves, mas você nunca deve injetá-las do mundo exterior. Eles sempre devem ser gerados dentro do processador, durante a inicialização. Fazer qualquer outra coisa invalida instantaneamente o resto - é automaticamente inseguro.

  2. Não armazene chaves na memória não volátil, você está correto nisso. Não importa se você protege a EEPROM ou a memória flash contra a leitura. Esse fusível de proteção de leitura de código é facilmente revertido. Um invasor precisa apenas decapar (remova ou grave quimicamente a embalagem de epóxi preto para expor a matriz de silício no interior). Nesse ponto, eles podem encobrir a parte do dado que é células de memória não volátil (essas seções são muito regulares e, embora as células de memória individuais sejam muito pequenas para serem vistas, a estrutura maior pode ser) e um pequeno pedaço de algo opaco ao UV é mascarado nessa seção. Em seguida, o atacante pode apenas acender uma luz UV no chip por 5 a 10 minutos e redefinir todos os fusíveis, incluindo o fusível CRP. A memória OTP agora pode ser lida por qualquer programador padrão.

Ou, se forem bem financiados (digamos, conseguir essas chaves vale mais de US $ 1000 para alguém), eles poderão ler as células de memória diretamente com vários tipos de microscópios eletrônicos.

Para serem seguras, as chaves devem ser apagadas, não ocultadas.

  1. Não, pelos mesmos motivos acima.

Agora, na opção 4:

  1. Basta usar criptografia. A distribuição de chaves é um problema resolvido. Portanto, use essa solução prontamente disponível. O chip deve usar seu RNG e várias outras considerações devem ser feitas para garantir que haja um suprimento suficiente de entropia disponível, e o carregador de inicialização deve inicializar diretamente no programa que gera a (s) chave (s) secreta (s) necessária (s), que devem ser de uso geral registra e é movido diretamente para a SRAM, onde permanecerão até serem apagados.

No entanto, há um problema: nada, exceto a CPU, tem alguma idéia de qual é a chave secreta. Não tem problema: use criptografia de chave pública. O que você armazenou na memória OTP é sua chave pública. Essa chave pode ser lida por qualquer pessoa, você pode publicá-la na troca de pilhas, pode pintá-la na lateral de um navio petroleiro em letras de 1,5 metro de altura, não importa. O maravilhoso da criptografia de chave pública é que ela é assimétrica. A chave para criptografar algo não pode descriptografá-la, o que requer a chave privada. E, inversamente, a chave para descriptografar algo criptografado pela chave pública não pode ser usada para criptografar algo. Portanto, a CPU gera as chaves secretas, usa sua chave pública armazenada para criptografar as chaves secretas e simplesmente as envia por USB ou RS232 ou o que você quiser. A leitura da chave secreta requer sua chave privada, que não precisam ser armazenados, enviados ou envolvidos com o chip. Depois de descriptografar a chave secreta com sua chave privada (em outro lugar, fora do chip), você estará pronto. Você tem uma chave secreta transmitida com segurança que foi GERADA inteiramente dentro do chip, sem ter que armazenar nada, exceto uma chave pública - que, como afirmado anteriormente, não precisa ser totalmente protegida contra leitura.

Esse processo é formalmente chamado de negociação-chave, e tudo o usa. Você já usou várias vezes hoje. Existem muitos recursos e bibliotecas disponíveis para lidar com isso. Por favor, nunca 'injete' chaves em nada.

Uma última coisa a mencionar: tudo isso é discutível, porque a chave AES pode ser facilmente recuperada usando ataques de canal lateral, que ficam na fonte de alimentação e medem as alterações mínimas no consumo de corrente e o tempo entre as alterações causadas pelos bits que são lançados na CPU como registros. Isso, combinado com o conhecimento de como o AES (ou qualquer outro conjunto muito pequeno de algoritmos de criptografia possíveis que poderiam ser usados), torna relativamente fácil e barato recuperar a chave. Não permitirá a leitura da chave, mas poderá reduzir o espaço da chave a algo ridiculamente pequeno, como 255 chaves possíveis. O chip também não pode detectá-lo, pois está a montante.

Isso derrotou os carregadores de inicialização criptografados AES-256 em processadores de criptografia 'seguros' e nem é tão difícil assim. Até onde eu sei, não existem medidas reais de contra-hardware para este ataque. No entanto, são os próprios algoritmos de criptografia e como eles exigem que uma CPU inverta bits, que está causando essa vulnerabilidade. Suspeito que algoritmos resistentes ou à prova de canal lateral precisem ser (e espero que estejam) sendo desenvolvidos.

Então, como está agora, a resposta real para como armazenar uma chave (ou até mesmo usar uma chave temporária) em um dispositivo incorporado com segurança é: você não pode.

Mas, pelo menos, se você gerar uma nova chave toda vez usando a negociação de teclas na opção 4, um ataque de canal lateral poderá comprometer apenas a chave de um canal em uso e apenas se houver algum tempo para monitorar a energia enquanto criptografa os dados. . Se você frequentemente negocia novas chaves geradas internamente, isso pode proporcionar quantidades úteis de segurança.

Gere chaves e guarde-as pelo menor tempo possível.

metacolina
fonte
Realmente, graças ao querido Metacollin por me liberar. Mas meu projeto consiste em muitos leitores (contém mcu) e muitos MCUs de destino. Cada leitor deve poder ler qualquer um dos destinos e qualquer um dos destinos deve ser lido por qualquer um dos leitores. disso, acho que eles devem concordar com uma chave exclusiva para o transporte de dados. e com base em sua resposta, acho que não há muitas diferenças entre, por exemplo, LPC18S57 secure córtex m3 e STM32F429 córtex geral m4 e até LPC1788 córtex geral m3 (escolha mais barata), não estou fazendo um projeto secreto, mas quero fazer isso o mais seguro possível.
Mahmoud Hosseinipour
2
Sua declaração de que "a chave AES pode ser facilmente recuperada" é pelo menos questionável. Entendo o princípio por trás da técnica de descobrir o que acontece no processador, com base em seu consumo atual. No entanto, assume que a criptografia e descriptografia é a única coisa em que a CPU está trabalhando. No entanto, a maioria dos aplicativos possui apenas 1 CPU, que funciona em várias tarefas ao mesmo tempo. Durante um bloco, a criptografia AES pode ocorrer dezenas ou centenas de interrupções, o que torna impossível descobrir a chave, com base nos picos atuais.
bakcsa83
2
Se a chave não deve ser armazenada em flash, o mesmo vale para o código que está gerando a chave ... basta traduzir os códigos op para o assembler e você terá a chave, não importa o quão complexo seja o código.
Lundin
The wonderful thing about private key cryptography is that it is asymmetric. Mesmo sabendo claramente do seu post, eu o mencionarei para outros leitores ... s / privado / público na citação acima.
Radian
Você pode proteger um canal entre dois dispositivos usando o método 4; no entanto, sem ter algum tipo de segredo compartilhado, não é possível garantir a autenticidade do dispositivo com o qual você está se comunicando. Se o seu caso de uso exigir autenticação, você não se sairá melhor com uma troca de chaves do que se estivesse simplesmente armazenando um único segredo compartilhado em flash. Se você precisar de uma segurança melhor, um chip criptográfico deve ser usado.
Greg