Ich bin kein Java-Entwickler, aber mein Kunde hat einen angeheuert, um einige JAR-Dateien auf ihrer Website zu aktualisieren. Zuvor haben wir den bestehenden Code geprüft und eine Reihe von Sicherheitslücken gefunden. Eine der Lösungen, mit denen wir die Dateien sicherer machen, besteht darin, einen neuen Datenbankbenutzer mit schreibgeschütztem Zugriff auf die Datenbank und nur für die Tabellen zu erstellen, für die die JAR-Dateien benötigt werden. Ich fand dann heraus, dass sie diese Anmeldeinformationen neben den JAR-Dateien in reinen Textdateien speichern, nur eine fundierte Vermutung von der breiten Öffentlichkeit. Und schließlich fordern sie heute viel lockere Datenbankprivilegien, aber ich denke nicht, dass sie versteht, dass sie sie wirklich für eine richtig geschriebene JAR-Datei nicht brauchen sollte.Wie werden sichere Datenbankverbindungen normalerweise in JAR-Dateien implementiert?
Wie auch immer, ich bin ziemlich sicher, dass dieser Entwickler keine Sicherheitslücke kennen würde, wenn er sie auf der Rückseite biss. Und ich weiß nicht genug über Java/JAR-Dateien, um sie richtig zu beraten, was sie tun sollte, nur genug über infosec, um ihr zu sagen, was sie nicht tun sollte tun.
Was sind die typischen Sicherheitsaspekte beim Schreiben einer verteilten JAR-Datei, die eine Verbindung zu einer entfernten MySQL-Datenbank herstellt? Gibt es eine Standardmethode zum Verschlüsseln der Verbindungsdetails (Benutzername und/oder Passwort)? IIRC, sind keine .jar-Dateien gerade verherrlichte ZIP-Archive, und konnte deshalb niemand die Datei entpacken und die Verbindungsdetails im Quellcode einsehen? Gibt es eine Möglichkeit, den JAR-Dateiinhalt zu verschlüsseln?
UPDATE: Ich erhielt die folgende Klarstellung vom Entwickler. Klingt das richtig?
Alle Klassen in der JAR-Datei sind verschlüsselt. Ich habe immer alle Klassendateien verschlüsselt, bevor ich sie in einer JAR-Datei archiviere. Wenn Sie ein [redacted] jar öffnen, sehen Sie nur verschlüsselten Code. Es besteht also keine Möglichkeit für einen Benutzer, den Quellcode durch Dekompilieren der Klasse anzuzeigen. Die Klassen verwenden jdbc, um eine Verbindung zur db herzustellen, die Suche muss mit der Datenbank verbunden sein, um sqls ausführen zu können. Diese sqls befinden sich in den verschlüsselten casees in der jar-Datei.
Als ich Sie nach der Verschlüsselung des DB-Passworts fragte, meinte ich, was Sie unten sagen. Wir werden einen Verschlüsselungscode in Java schreiben und benutzen. Die kompilierte Klasse aus diesem Quellcode wird erneut als Teil des Routinen-Verschlüsselungsverfahrens verschlüsselt. Wir verwenden ein Java-Verschleierungstool namens Retroguard, um alle Klassen zu verschlüsseln. Wir integrieren auch einen Schlüssel in die HTML-Seite, um sicherzustellen, dass die Anwendung nur funktioniert, wenn sie von der Website [redacted] heruntergeladen wurde. Wenn der Benutzer das Glas auf seinen lokalen Computer kopiert und versucht, es auszuführen, wird es fehlschlagen.
Welche Anmeldeoptionen unterstützt Ihr DB-System? Unterstützt es die Verwendung signierter Schlüssel (a la SSH) anstelle von user/pass? Gibt es andere Authentifizierungsmechanismen (LDAP, AD, PAM) in der Umgebung, die anstelle von DB-Authentifizierung verwendet werden können? – Freiheit
Wenn Sie die Details verschlüsseln, müssen Sie sie auf dem Client entschlüsseln. Spiel ist aus. Dann werden Sie sie wahrscheinlich im Klartext über den Draht schicken - was bedeutet, dass ein Gegner nicht einmal die Mühe haben muss, Java installiert zu haben. –
Dank Tom, ich hatte nicht gedacht, dass das Endergebnis irgendeine Sicherheit übertrifft, die wir im Design implementieren. Dieser spezielle mysql-Benutzer hat nur Lesezugriff, daher bin ich fast versucht zu sagen "OK, was auch immer, zumindest können sie die Daten nicht ändern, wenn sie die Verbindungsparameter erhalten", aber ich fühlte mich nicht gut es auf lange Sicht. –