Wie verhindern Sie, dass String-Literale in kompilierten Klassendateien angezeigt werden?

8

Wenn Sie eine .java-Datei in eine .class-Datei kompilieren, wenn Sie eine Zeile wie

haben %Vor%

Wenn Sie die .class-Datei in einem Texteditor öffnen, sehen Sie

%Vor%

Irgendwo in der Datei inmitten des verrückten Gockels.

Was für die meisten Dinge gut und gut ist, aber nicht im Umgang mit sensiblen Informationen wie API-Schlüsseln.

Natürlich ist eine Alternative, den API-Schlüssel aus einer anderen Datei zu lesen, aber das macht es einfacher, den Schlüssel zu finden, da die Person jetzt einfach "key.txt" öffnen kann, wenn sie die .jar-Datei öffnet.

Wie verschlüsseln Sie also ein Zeichenfolgenliteral in Ihrer .class-Datei?

    
CSDragon 16.04.2015, 10:33
quelle

4 Antworten

6

Wenn Sie Code an einen Drittanbieter senden, verlieren Sie die Kontrolle darüber. Selbst wenn Sie den API-Schlüssel als verschlüsselte Zeichenfolge einbetten möchten, könnte ein Angreifer dennoch versuchen und es möglicherweise erfolgreich brechen, wodurch alle Ihre Bemühungen zur Ver- und Entschlüsselung vergeblich wären.

Die beste Lösung wäre meines Erachtens, keine sensiblen Informationen innerhalb der Anwendung bereitzustellen, sondern sie mit einer Art von ID zu versehen. Alle sensiblen Werte, die es benötigt, würden dann durch die Verwendung einer sicheren Verbindung gezogen werden.

    
npinti 16.04.2015 10:38
quelle
4

Wenn Sie einen Schlüssel verwenden, um auf eine API von Drittanbietern zuzugreifen, gibt es keine Möglichkeit, diesen Schlüssel vor dem Endbenutzer zu schützen, wenn Sie ihn mit Ihrem Code / Ihrer Anwendung versenden oder wenn Ihre Anwendung auf die API von Drittanbietern zugreifen soll ohne Zwischenhändler.

Der Endbenutzer konnte einfach alle Daten lesen, die von Ihrer App an den Endpunkt gesendet wurden, und den API-Schlüssel kennen. Unabhängig von den Maßnahmen, die Sie ergriffen haben, um es zu verschlüsseln, müssen Sie es mindestens einmal entschlüsselt an die dritte Partei senden.

Der sichere Weg dazu besteht darin, dass sich Ihr Benutzer bei einem von Ihnen bereitgestellten Dienst anmeldet, eine Anfrage an Ihren Dienst sendet und dann Ihr Dienst (der sich vermutlich nicht auf dem Rechner Ihres Endbenutzers befindet) sendet eine Anfrage an die API mit dem Schlüssel. Der Endanwender kennt den Schlüssel also nie.

    
Rouby 16.04.2015 10:43
quelle
1

Wenn Sie die Informationen in der Klassendatei speichern, sollte der Entschlüsselungsschlüssel von außerhalb der Klasse kommen. Sie können die Daten verschlüsseln, aber wenn Sie alle Informationen in der Klassendatei haben, sind Sie verloren.

Sie sollten API-Schlüssel in Konfigurationsdateien speichern. Sie haben unterschiedliche API-Schlüssel für die Entwicklung und für das Live, oder?

Eine andere mögliche Lösung besteht darin, KeyStore zu verwenden, was Ihnen erlaubt sensible Informationen in einem öffentlich zugänglichen Format zu speichern. Nur der Besitzer des geheimen Schlüssels kann die sensiblen Daten entschlüsseln.

    
gaborsch 16.04.2015 10:37
quelle
0

Selbst wenn Sie diese Informationen in Ihrer Klasse verschlüsselt aufbewahren, kann ein Hacker den Mechanismus finden, um diesen nur aus Ihrem Code zu entschlüsseln. Also IMHO ist es besser, diese verschlüsselten Informationen in einer anderen Datei zu behalten und diese Datei zu lesen. Beschränken Sie den Zugriff auf diese Datei auch mithilfe von Betriebssystemsicherheitsmechanismen.

    
Aakash 16.04.2015 10:37
quelle