So speichern Sie einen privaten Schlüssel im Code [duplizieren]

8

Ich arbeite an einem Softwareprojekt, bei dem die Anwendung in einer nicht vertrauenswürdigen Umgebung ausgeführt wird. Ich muss einige zusätzliche kryptografische Signaturen durchführen (was bedeutet, dass dies nicht das primäre Mittel zur Sicherung von Daten ist), aber ich möchte den Schlüssel nicht als solchen sehen:

%Vor%

Welche Methode kann ich verwenden, um dies vernünftig zu sichern? Ich bin mir bewusst, dass nichts der Beweis ist, aber das wird eine zusätzliche Schicht in der Sicherheitswand hinzufügen.

Zur Klarstellung: Ich habe im Wesentlichen einen String, den ich nicht einfach in einem Debugger oder durch Reflektion herausziehen möchte. Ich bin mir bewusst, dass die Dekompilierung der Klassendatei im Wesentlichen dazu führen könnte, aber das ist ein akzeptables Risiko.

Offensichtlich wäre es ideal, den Schlüssel extern zu speichern, aber ich kann den Internetzugang nicht garantieren.

    
Jason Nichols 12.01.2010, 16:05
quelle

5 Antworten

5

Es ist unmöglich, einen Schlüssel in einer nicht vertrauenswürdigen Umgebung zu sichern. Sie können Ihren Code verschleiern, Sie können einen Schlüssel aus beliebigen Variablen erstellen, was auch immer. Unter der Annahme, dass Sie die Standardbibliothek javax.crypto verwenden, müssen Sie Mac.getInstance() aufrufen und irgendwann später init() für diese Instanz aufrufen. Jemand, der deinen Schlüssel haben will, wird es bekommen.

Allerdings glaube ich, dass Sie den Schlüssel an die Umgebung binden, nicht an das Programm. Eine Signatur soll sagen, dass die Daten von einer bekannten Quelle stammen und nicht manipuliert wurden, seit diese Quelle sie bereitgestellt hat. Momentan versuchst du zu sagen "garantiere, dass mein Programm die Daten produziert hat". Ändern Sie stattdessen Ihre Anforderung, um "sicherzustellen, dass ein bestimmter Benutzer meines Programms die Daten erstellt hat". Die Aufgabe wird dann zu diesem Benutzer verschoben, um sich um seinen / ihren Schlüssel zu kümmern.

    
kdgregory 12.01.2010, 16:35
quelle
1

Vergessen Sie, es im Code zu verdunkeln. Dadurch wird Ihre Software nur noch schwerer zu lesen, zu debuggen und zu warten. Sie werden auch genagelt, wenn Ihre Software eine Sicherheitsüberprüfung durchlaufen muss.

Wenn Sie den Schlüssel nicht sicher aufbewahren können (sicher auf der Festplatte, sicherer Speicher oder eine Passphrase in jemand anderem), sollten Sie sich um nichts anderes kümmern.

Wenn Sie sich in einer * nix-Umgebung befinden, ist das Speichern des Schlüssels auf der Festplatte mit root / root 400-Berechtigungen möglicherweise "gut genug".

Unter Windows können Sie die DPAPI verwenden, um die Daten im sicheren Speicher von Microsoft zu speichern.

Sie können auch einen leichtgewichtigen PBE verwenden, um den vertraulichen Schlüssel zu verschlüsseln und den Benutzer beim Starten der Anwendung die Passphrase eingeben zu lassen.

    
Kevin 12.01.2010 16:09
quelle
0

Wessen privater Schlüssel ist das? Der private Schlüssel soll privat sein, daher ist es falsch, ihn zu verteilen.

    
Bozho 12.01.2010 16:10
quelle
0

Zunächst einmal - gut, dass Sie über dieses Problem nachdenken!

Ist es stattdessen möglich, einen privaten Schlüssel zu generieren, mit Ihrer Zertifizierungsstelle zu kommunizieren und ihn zu signieren (und auch eine CRL zu verwalten)?

Wenn dies unter Windows ausgeführt wird, können Sie die Crypto-API alternativ verwenden, um einen privaten Schlüssel sicher zu speichern, der als nicht exportierbar markiert ist. Wie Sie diesen Schlüssel sicher verteilen, kann jedoch eine andere Herausforderung sein.

    
Goyuix 12.01.2010 16:11
quelle
0

Können Sie den privaten Schlüssel in zwei Teile zerlegen: Speichern Sie einen in Ihrem Programm und fordern Sie dann interaktiv die zweite Hälfte an - wenn Ihre App startet?

    
monojohnny 12.01.2010 16:53
quelle

Tags und Links