Nenhuma dessas opções é particularmente melhor ou pior que as outras, porque são todas muito inseguras. Vou com a opção 4.
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.
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.
- Não, pelos mesmos motivos acima.
Agora, na opção 4:
- 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.