Speichern eines sicheren Schlüssels im Speicher eines eingebetteten Geräts

10

Ich arbeite an einem eingebetteten Gerät, das Daten sendet / empfängt und im Chiffretext-Modus (verschlüsselter Modus) speichert. Was ist nun der beste Ansatz zum Speichern von Schlüsseln (ich habe die MCU der ARM CORTEX M-Serie verwendet)?

1-Speichern von Schlüsseln im SRAM-Speicher und in jeder Startsequenz, Injizieren von Schlüsseln in die eingebettete MCU und Speichern dieser Schlüssel im SRAM-Speicher. Ich denke, es ist der beste Weg, wenn die MCU das Eindringen (mit Manipulationssensor oder ...) erkennt, kann sie den SRAM schnell löschen und sich selbst zurücksetzen. Nachteil: Wenn es dem Angreifer gelingt, Stampfer zu übergeben und auf das Gerät zuzugreifen, wie sicher ist der SRAM-Speicher (gegen Code Mining). Ich kann keine Sicherheitsfunktion für diesen Speicher in MCUs finden.

2-Generieren Sie Schlüssel und speichern Sie sie im Flash-Speicher der Programmier-MCU. MCU-Flash-Speicher unterstützen CRP (Code Read Protection), das Code Mining verhindert. Mithilfe der internen AES-Engine und der RNG-Engine (Random Number Generation) können wir einen Zufallsschlüssel erstellen und den Flash-Speicher verschlüsseln und diesen Zufallsschlüssel im OTP speichern ( einmal programmierbarer Speicher - ein 128-Bit-verschlüsselter Speicher), dann dekodieren wir bei der Codeausführung den Flash-Speicher mit dem RNG-Schlüssel und greifen auf den Anfangsschlüssel und die Codes zu. Nachteil: Schlüssel, die in einem nichtflüchtigen Speicher gespeichert sind, Stampfer sind nutzlos und Angreifer haben viel Zeit, um Schlüssel abzubauen.

3-gespeicherter Schlüssel im EEPROM-Speicher, Kombination von 2 oben, Schlüssel im nichtflüchtigen Speicher gespeichert, aber wenn Stampfer das Eindringen spüren, kann das EEPROM gelöscht werden.

Ich betrachte LPC18S57FBD208 (Cortex m3 mit 1 MB Flash-Speicher, 180 MHz, 136 KB SRAM, 16 KB EEPROM und einem TFT-LCD-Controller, den ich zum Antreiben einer 7-Zoll-TFT-LCD- und AES-128-Bit-Krypto-Engine benötige). Gibt es dafür einen anderen besseren Vorschlag?

Mahmoud Hosseinipour
quelle

Antworten:

18

Keine dieser Optionen ist besonders besser oder schlechter als die anderen, weil sie alle sehr unsicher sind. Ich gehe mit Option 4.

  1. SRAM ist der sicherste Ort zum Aufbewahren von Schlüsseln, aber Sie dürfen sie niemals von außen injizieren. Sie müssen IMMER während des Startvorgangs im Prozessor generiert werden. Wenn Sie etwas anderes tun, wird der Rest sofort ungültig - es ist automatisch unsicher.

  2. Speichern Sie keine Schlüssel im nichtflüchtigen Speicher, da sind Sie richtig. Es spielt keine Rolle, ob Sie das EEPROM oder den Flash-Speicher vor dem Lesen schützen. Diese Code-Leseschutzsicherung kann leicht vertauscht werden. Ein Angreifer muss nur entkappen (die schwarze Epoxidverpackung entfernen oder chemisch wegätzen, um den Siliziumchip im Inneren freizulegen). Zu diesem Zeitpunkt können sie den Teil des Chips verdecken, der nichtflüchtige Speicherzellen sind (diese Abschnitte sind sehr regelmäßig und während einzelne Speicherzellen viel zu klein sind, um gesehen zu werden, kann die größere Struktur sein) und ein kleines Stück von etwas UV-undurchlässig ist über diesem Abschnitt maskiert. Dann kann der Angreifer einfach 5-10 Minuten lang UV-Licht auf den Chip richten und alle Sicherungen, einschließlich der CRP-Sicherung, zurücksetzen. Der OTP-Speicher kann jetzt von jedem Standardprogrammierer gelesen werden.

Oder wenn sie gut finanziert sind (z. B. sind diese Schlüssel für jemanden mehr als 1000 US-Dollar wert), können sie die Speicherzellen einfach direkt mit verschiedenen Arten von Elektronenmikroskopen lesen.

Um sicher zu gehen, müssen die Schlüssel gelöscht und nicht verborgen werden.

  1. Nein, aus den gleichen Gründen wie oben.

Nun zu Option 4:

  1. Verwenden Sie einfach die Verschlüsselung. Die Schlüsselverteilung ist ein gelöstes Problem. Verwenden Sie also diese leicht verfügbare Lösung. Der Chip sollte sein RNG verwenden und verschiedene andere Überlegungen sollten angestellt werden, um sicherzustellen, dass eine ausreichende Entropieversorgung zur Verfügung steht, und der Bootloader sollte direkt in das Programm booten, das die erforderlichen geheimen Schlüssel generiert, was für allgemeine Zwecke vorgesehen ist registriert und direkt in SRAM verschoben, wo sie bleiben, bis sie gelöscht werden.

Es gibt jedoch ein Problem, nämlich dass nichts außer der CPU eine Ahnung hat, was der geheime Schlüssel ist. Kein Problem: Verwenden Sie die Kryptografie mit öffentlichem Schlüssel. Was Sie im OTP-Speicher gespeichert haben, ist Ihr öffentlicher Schlüssel. Dieser Schlüssel kann von jedem gelesen werden, Sie können ihn beim Stapeltausch veröffentlichen, Sie können ihn in 5 Fuß hohen Buchstaben auf die Seite eines Öltankers malen, es spielt keine Rolle. Das Wunderbare an der Kryptographie mit öffentlichen Schlüsseln ist, dass sie asymmetrisch ist. Der Schlüssel zum Verschlüsseln kann etwas nicht entschlüsseln, für den der private Schlüssel erforderlich ist. Umgekehrt kann der Schlüssel zum Entschlüsseln von etwas, das mit dem öffentlichen Schlüssel verschlüsselt wurde, nicht zum Verschlüsseln von etwas verwendet werden. Die CPU generiert also die geheimen Schlüssel, verwendet Ihren gespeicherten öffentlichen Schlüssel, um die geheimen Schlüssel zu verschlüsseln, und sendet sie einfach über USB oder RS232 oder was auch immer Sie möchten. Zum Lesen des geheimen Schlüssels ist Ihr privater Schlüssel erforderlich. die nicht gespeichert, gesendet oder jemals mit dem Chip in Verbindung gebracht werden müssen. Sobald Sie den geheimen Schlüssel mit Ihrem privaten Schlüssel (an anderer Stelle außerhalb des Chips) entschlüsselt haben, sind Sie eingestellt. Sie haben einen sicher übertragenen geheimen Schlüssel, der vollständig im Chip generiert wurde, ohne dass etwas anderes als ein öffentlicher Schlüssel gespeichert werden muss - der, wie bereits erwähnt, überhaupt nicht vor dem Lesen geschützt werden muss.

Dieser Prozess wird formal als Schlüsselverhandlung bezeichnet, und alles wird von ihm verwendet. Sie haben es heute mehrmals benutzt. Es stehen viele Ressourcen und Bibliotheken zur Verfügung, um damit umzugehen. Bitte injizieren Sie niemals Schlüssel in irgendetwas.

Eine letzte Sache, die zu erwähnen ist: All dies ist umstritten, da der AES-Schlüssel leicht mithilfe von Seitenkanalangriffen wiederhergestellt werden kann, die auf der Stromversorgung sitzen und winzige Änderungen der Stromaufnahme und den Zeitpunkt zwischen diesen Änderungen messen, die durch das Umdrehen von Bits in der CPU verursacht werden als Register. In Kombination mit dem Wissen darüber, wie AES (oder was auch immer einer der sehr kleinen möglichen Verschlüsselungsalgorithmen sein könnte) funktioniert, ist es relativ einfach und kostengünstig, den Schlüssel wiederherzustellen. Es erlaubt nicht, den Schlüssel zu lesen, aber es kann den Schlüsselraum auf etwas lächerlich Kleines wie 255 mögliche Schlüssel eingrenzen. Der Chip kann es auch nicht erkennen, da es sich stromaufwärts befindet.

Dies hat AES-256-verschlüsselte Bootloader auf "sicheren" Kryptoprozessoren besiegt und es ist nicht einmal so schwer. Soweit ich weiß, gibt es keine echten Hardware-Gegenmaßnahmen gegen diesen Angriff. Es sind jedoch die Verschlüsselungsalgorithmen selbst und wie sie eine CPU zum Umdrehen von Bits benötigen, die diese Sicherheitsanfälligkeit verursacht. Ich vermute, dass seitenkanalresistente oder seitenkanalsichere Algorithmen entwickelt werden müssen (und hoffentlich werden).

So wie es jetzt aussieht, lautet die eigentliche Antwort darauf, wie man einen Schlüssel sicher auf einem eingebetteten Gerät speichert (oder einfach nur einen temporären Schlüssel verwendet): Sie können nicht.

Zumindest wenn Sie jedoch jedes Mal einen neuen Schlüssel mithilfe der Schlüsselverhandlung in Option 4 generieren, kann ein Seitenkanalangriff nur den Schlüssel eines verwendeten Kanals gefährden und nur dann, wenn er eine Weile Zeit hat, die Leistung zu überwachen, während er Daten verschlüsselt . Wenn Sie häufig neue, intern generierte Schlüssel aushandeln, kann dies nützliche Sicherheitsmaßnahmen bieten.

Generieren Sie Schlüssel und speichern Sie sie so kurz wie möglich.

Metacollin
quelle
Vielen Dank, lieber Metacollin, dass Sie mich gelöscht haben. Aber mein Projekt besteht aus vielen Lesern (enthält mcu) und vielen Ziel-MCUs. Jeder Leser muss in der Lage sein, eines der Ziele zu lesen, und jedes der Ziele muss von einem der Leser gelesen werden können Ich denke, sie müssen sich mit einem eindeutigen Schlüssel für den Datentransport einverstanden erklären. und basierend auf Ihrer Antwort denke ich, dass es dann nicht so viele Unterschiede zwischen zum Beispiel LPC18S57 Secure Cortex M3 und STM32F429 General Cortex M4 und sogar LPC1788 General Cortex M3 (billigere Wahl) gibt. Ich mache kein streng geheimes Projekt, aber ich möchte es tun das so sicher wie ich kann.
Mahmoud Hosseinipour
2
Ihre Aussage, dass "AES-Schlüssel leicht wiederhergestellt werden kann", ist zumindest fraglich. Ich verstehe das Prinzip hinter der Technik, anhand des aktuellen Verbrauchs herauszufinden, was im Prozessor passiert. Es wird jedoch davon ausgegangen, dass nur Verschlüsselung und Entschlüsselung an der CPU arbeiten. Die meisten Anwendungen verfügen jedoch nur über 1 CPU, die gleichzeitig für eine Reihe von Aufgaben ausgeführt wird. Während eines Blocks kann es zu einer AES-Verschlüsselung von zehn oder Hunderten von Interrupts kommen, die es unmöglich macht, den Schlüssel anhand der aktuellen Spitzenwerte herauszufinden.
Bakcsa83
2
Wenn der Schlüssel nicht in Flash gespeichert werden soll, gilt das Gleiche für den Code, der den Schlüssel generiert. Sie müssen nur die Operationscodes in Assembler übersetzen und haben dann den Schlüssel, egal wie kompliziert der Code ist.
Lundin
The wonderful thing about private key cryptography is that it is asymmetric. Obwohl aus Ihrem Beitrag hervorgeht, dass Sie dies wissen, werde ich es im obigen Zitat für andere Leser erwähnen ... s / privat / öffentlich.
Radian
Möglicherweise können Sie mit Methode 4 einen Kanal zwischen zwei beliebigen Geräten sichern. Ohne ein gemeinsames Geheimnis können Sie jedoch nicht die Authentizität des Geräts garantieren, mit dem Sie kommunizieren. Wenn Ihr Anwendungsfall eine Authentifizierung erfordert, sind Sie mit einem Schlüsselaustausch nicht besser dran als wenn Sie einfach ein einzelnes gemeinsames Geheimnis in Flash speichern. Wenn Sie eine bessere Sicherheit benötigen, sollte ein Krypto-Chip verwendet werden.
Greg