API Key´s in der Datenbank decrypt / encrypten?

internet

Top Contributor
Ich habe eine einfache Frage, vllt. kann hier jemand aus der Erfahrung seine Meinung kundtun.

Ich möchte in meiner APP Tokens speichern. Zum Beispiel einen Token von PayPal, sodass mein User für dessen Kunden eine Bezahlmöglichkeit anbietet.

Ich habe das bei einer anderen App gesehen, die über 30.000 Kunden hat. Hier wird der API Key zB als normaler String angezeigt.
Ist das so richtig? Wäre es aus Sicherheitsgründen nicht besser den Key unleserlich zu machen?
 

LimDul

Top Contributor
Schwieriges Thema. Den eins ist klar:
Der Token wir als Klartext benötigt, sprich die Anwendung muss in der Lage sein, diesen als Klartext zu ermitteln.

Das heißt, als einzige Verschlüsselungsverfahren kommen nur Verfahren in Frage, wo der Entschlüsselungskey in der Anwendung gespeichert ist.
Willst du den als Klartext speichen? Wenn nein, dann hast du das gleiche Problem :)

Das heißt, an irgendeiner Stelle muss zwangsläufig ein Schlüssel im Klartext gespeichert sein, der dir alles aufschließt. Das ist so und lässt sich nicht vermeiden.

Was da jetzt wirklich best Practice ist, weiß ich nicht. Das hängt auch immer von der Architektur und Co ab. Fragen, die ich mir stellen würde:
* Welche Informationen muss ein Angreifer mitnehmen können, damit er (finanziellen) Schaden anrichten kann?
* An welche Sachen kommt man als Angreifer / Nutzer relativ trivial ran? Beispiel, z.B. wenn ich meiner Handy App den Schlüssel hart kodiere um so ein Token zu entschlüsseln, kann ich es mir auch schenken - den Key aus der App zu extrahieren ist jetzt nicht wirklich schwer.
* Man kann solche Keys auch je nach Architektur in geschützten Bereichen ablegen

Mein persönliche Meinung wäre, ich würde die API-Keys in der DB mit einen symmetrischen Verfahren verschlüsseln und Key irgendwo ablegen, wo zum einen schwer Zugriff besteht und wo die Stelle physisch auch von der DB getrennt ist.
 

internet

Top Contributor
Genau, das ist das Problem, dass der Key so oder so entschlüsselt werden kann.
Ich hatte das Thema auch mal an den oben genannte Softwareanbieter addressiert. Hier war die in etwa Aussage:

"Man geht davon aus, dass wenn der User sich in dem Account eingeloggt hat, auch derjenige ist, dem der API Key gehört".

Kurz zum Verständnis. Es geht um eine JSF - Anwendung (keine native Handy App).

Mein persönliche Meinung wäre, ich würde die API-Keys in der DB mit einen symmetrischen Verfahren verschlüsseln und Key irgendwo ablegen, wo zum einen schwer Zugriff besteht und wo die Stelle physisch auch von der DB getrennt ist.
Wäre meine Idee nun auch gewesen. Außer dass ich den private Key direkt im Code habe. Sicherlich auch nicht die beste Lösug.
D.h. ein Haker müsste erstmal Zugriff auf den Server gelangen und das WAR - File zu holen und dann die .class Dateien des Byte Codes umwandeln.
 

LimDul

Top Contributor
Bei Code hab ich immer etwas Bauchschmerzen, den der Code ist in der Regel irgendwo versioniert abgelegt - sprich in einem GIT, wo ggf. viele Entwickler Zugriff haben. Durchs clonen landet der dann auf vielen verschiedenen Entwicklerrechnern, so dass ein komprimitierter Rechner da reicht das der Key entfleucht. Klar, solange nur 1 oder 2 Personen entwickeln, die eh Zugriff auf das Produktivsystem haben, mag das ok sein - aber wenn man mal wächst nicht. Ich entwickle hier auch bei einer großen Enterprise Anwendung mit und ab Vorproduktion hab ich keinen Zugriff mehr auf die Systeme. Auf den Code haben hier aber vermutlich um die 70 Leute Zugriff - aber Vorproduktion & Produktion signifikant weniger (Vermutlich kleiner 10).
 

Thallius

Top Contributor
Wo liegt denn jetzt das Problem? Du must ja nur einen Login für deine App haben. Dieses Login benötigt ein Passwort das du nur als Hash an den Server schickst.
Dieses Passwort benutzt du dann auch als Salt für das Encrypten der Token.
Damit kann niemand die Token entschlüsseln der dieses Passwort nicht kennt.
 

httpdigest

Top Contributor
Ja, also wenn dieser "Token" sowieso pro User deiner App existiert und es nicht ein einziger, geteilter Token für den externen Dienstleister für alle deine User ist, dann sehe ich da auch überhaupt kein Problem. Ist der Token kompromittiert -> revoke, und neuen erstellen (lassen).
 

internet

Top Contributor
Ist ein guter Ansatz. Weiß nicht, ob ich ganz richtig verstehe. Hier in meinen Worten:

1) User hat ein Passwort. "Test1234". Das wird in der DB als "jsjdkasjdfnaskjdaskjfhsakjfhskjfhsdkfsdfasasas" gespeichert (Hash).
2) "jsjdkasjdfnaskjdaskjfhsakjfhskjfhsdkfsdfasasas" wird dann auch als Salt verwendet.
-> Heißt: wenn gemand den String "jsjdkasjdfnaskjdaskjfhsakjfhskjfhsdkfsdfasasas" (also Zugriff auf die DB hat), kann er auch den Token lesen, richtig?

Der Token ist pro "Mandant". Also ein Mandat hat mehrere User....
 

Thallius

Top Contributor
Hm ok, dass mehrere User den gleichen Token benutzen halte ich für keine gute Idee. Warum soll das so sein?

Wenn du den token aus den Hash erstellst ist ja wieder jeder der Zugriff auf den Server hat in der Lage den Token zu benutzen. Du must sicherstellen, dass der Token nur beim Client entschlüsselt werden kann.
 

httpdigest

Top Contributor
Und wieso muss der Token überhaupt am Client existieren? Er dient doch dazu, mit einem externen Drittsystem (z.B. Zahlungsdienstleister) zu reden. Das sollte sowieso nicht die Frontend-App machen, sondern ein Backend... und die Legitimation, dass der User das auch darf (über das Backend) wird ihm gegeben durch einen korrekten Login/Authentifizierung an dein eines Backend.
API Calls zu Drittsystemen sollten überhaupt niemals direkt vom Frontend ausgehen.
 

internet

Top Contributor
Hm ok, dass mehrere User den gleichen Token benutzen halte ich für keine gute Idee. Warum soll das so sein?

1)
Der Payment Provider wird einmalig als Zahlungsmittel bei einem Mandant hinterlegt (PayPal, Stripe usw.).
Das Anlegen kann ein belieber User des Accounts (Mandant) machen.

2) Ich benötige den API doch nur im Backend... Der API Key wird einmalig im Frontend eingegeben und gespeichert.
Den API Key zu bekommen, soll doch auch möglich sein, wenn sich der User nicht eingeloggt hat.

Wenn ich es richtig sehe, kann ich den Token unleserlich machen (encrypt / decrypt), dass man den richtigen Token nicht speichert.
Weiß aber jemand den Encrypt Key (wie auch immer der gebildet wird, zB aus dem Passwort des Users), kann er diesen sich doch selbst generieren???

Siehe auch:
Wenn du den token aus den Hash erstellst ist ja wieder jeder der Zugriff auf den Server hat in der Lage den Token zu benutzen. Du must sicherstellen, dass der Token nur beim Client entschlüsselt werden kann.
 

Thallius

Top Contributor
Also nochmal zur Klärung des Workflows:

Ein User deiner App hat mehrere Mandanten. Diese sind auch User der App oder nicht?
Dieser User legt jetzt eine Zahlungmethode für den Mandanten fest. Z.B. Paypal. Damit der Mandant dann auch per PayPal zahlen kann braucht er einen Token? Wozu ist der gut? Was macht der?
 

internet

Top Contributor
Ich möchte nicht zwingend zahlen. Der Mandant soll Zahlungen erhalten können. (Von den Kunden des Mandanten).
Der Token wird eben verwendet um diese Zahlungen empfangen zu können.
 

Thallius

Top Contributor
Also sprich das einzige was man mit dem Token machen kann ist dem Besitzer Geld überweisen? Dann sehe ich da sicherheitstechnischen Probleme :) Den würde ich sogar ins öffentlich Netz stellen
 

Thallius

Top Contributor
Also ich finde es keine gute Idee so einen Token zu speichern egal wo. Ich würde den niemals aus der Hand geben. Wenn der Mandant bezahlen können soll, dann würde ich, wie eben jeder andere Shop auch, entsprechend die PayPal Seite aufrufen und fertig.
 

internet

Top Contributor
der Kunde des Mandanten soll bezahlen.

Der Kunde wird doch an PayPal weitergeleitet und muss dann sich einloggen bzw. dann zahlen.
Aber irgendwie muss meine App ja wiederum wissen an wen das Geld geht, welcher Betrag usw. (das geht über die API)
 

internet

Top Contributor
vielleicht geht das im C2C Bereich so. Aber ich rede hier von B2C oder B2B. PayPal war jetzt auch nur ein Beispiel.
Wie soll es bei Stripe gehen? Da wird ein Token benötigt.

Hier mal ein Beispiel:
 

Thallius

Top Contributor
Nochmal. Wenn jemand einen Paypal oder was auch immer Token , mit dem man Geld von seinem Konto überweisen kann, irgendwo hinterlegt, dann gehört er erschossen.
 

LimDul

Top Contributor
Nochmal. Wenn jemand einen Paypal oder was auch immer Token , mit dem man Geld von seinem Konto überweisen kann, irgendwo hinterlegt, dann gehört er erschossen.
Nope, das ist ganz normale Praxis. Wie soll sonst ein Zahlungsdienstleister arbeiten? Ich glaube dir ist nicht bewusst wie so etwas funktioniert. Wenn du eine Anwendung veröffentlichst und darüber Paypal Zahlungen abwickeln willst musst du deinen Paypal-Token dort hintelegen.

Jede Seite, die Paypal Zahlungen anbietet hat in ihrer Anwendung - decodierbar im Klartext - ihren Token hinterlegt.

Und sobald ein Drittanbieter dazwischen schaltest - musst du da den Token hinterlegen. Wenn du eine Shop-Software kaufst und dort Paypal Zahlungen anbieten willst - guess what, du hinterlegst deinen Paypal Token dort.
 

LimDul

Top Contributor
Also ich finde es keine gute Idee so einen Token zu speichern egal wo. Ich würde den niemals aus der Hand geben. Wenn der Mandant bezahlen können soll, dann würde ich, wie eben jeder andere Shop auch, entsprechend die PayPal Seite aufrufen und fertig.
Wofür man das Token braucht, wenn man es als Business Account macht :)

Das ist ja der Punkt - um Paypal anzubinden reicht nicht ein Link auf Paypal, sondern es muss sich entsprechend mit den API-Credentials (aka der API Key identifziert werden).

Und das ist bei quasi allen Zahlungsdienstleistern so.
 
K

kneitzel

Gast
Aber da geht es dann unter dem Strich nicht um das Senden von Geld sondern das Empfangen von Geld incl. der Verifikation, das das Geld gezahlt wurde, damit man direkt Ware ausgeben kann und so ...

Das sind keine Token, mit denen ich Geld anweisen kann.

Also so wie eine IBAN. Klar: doof, wenn die ganzen bösen Jungs mir Millionen überweisen und ich vor lauter Geldeingängen Probleme habe, meine Ausgaben zu prüfen, aber das Risiko muss ich tragen ... :)
 

internet

Top Contributor
Naja, aber den Kontostand oder ähnliches kannst du ja trotzdem abrufen... Und ich meine du kannst auch Rückbuchungen via API ausführen.

Ich finde es keinen Schaden eine gewisse Sicherheit in die App einzubauen.

Wenn ich es zusammenfasse:
- Es gibt keine 100%ige Sicherheit, da der Private Key an irgendeiner Stelle sein muss.

Der erste Beitrag von @LimDul war ziemlich treffend m.M.

Stand jetzt werde ich den Private Key direkt in der App einbauen / auf dem Server lassen
 

mihe7

Top Contributor
Kurz zum Verständnis. Es geht um eine JSF - Anwendung (keine native Handy App).

Wäre meine Idee nun auch gewesen. Außer dass ich den private Key direkt im Code habe. Sicherlich auch nicht die beste Lösug.
D.h. ein Haker müsste erstmal Zugriff auf den Server gelangen und das WAR - File zu holen und dann die .class Dateien des Byte Codes umwandeln.
Um den Spaß nicht im Code zu haben, kann man das konfigurierbar machen. Und ja: irgendwo muss man mal einen Punkt setzen.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
I Erste Schritte Einfache Datenbank-Webseite erstellen als Nicht-IT-lerin Java Basics - Anfänger-Themen 24
M Daten aus errechneter Methode in Datenbank(SQLite) schreiben Java Basics - Anfänger-Themen 60
S Best Practice Fragen zu Projektstruktur einer Datenbank-Abfrage-App (MVC) Java Basics - Anfänger-Themen 13
I Element n aus Datenbank Query (JPA / Hibernate) Java Basics - Anfänger-Themen 3
I Passwort in Datenbank speichern um später wieder auszulesen Java Basics - Anfänger-Themen 5
S OOP Java Eingabe in verschiedene Datenbank Tabellen eintragen Java Basics - Anfänger-Themen 7
I H2 Datenbank starten / Daten in File speichern Java Basics - Anfänger-Themen 25
E schneller von der Datenbank abfragen Java Basics - Anfänger-Themen 15
E Datenbank Spalte zusammenzählen Java Basics - Anfänger-Themen 2
R Datenbank Java Basics - Anfänger-Themen 1
I Werte (u.a. Geldbeträge) in Datenbank speichern und Rundungen? Java Basics - Anfänger-Themen 8
M Mehrere Datenbank zugriffe über tomee.xml regeln? Java Basics - Anfänger-Themen 1
M Datenbank oder Textdatei? Java Basics - Anfänger-Themen 4
S Datenbank Befehl nach Login Java Basics - Anfänger-Themen 5
S Datenbank Tabelle eine Zeile an einer bestimmten Stelle einfügen Java Basics - Anfänger-Themen 2
M Von der Datenbank zum Textfield Java Basics - Anfänger-Themen 16
R Best Practice Logik in der Datenbank oder in Java? Java Basics - Anfänger-Themen 3
R Datenbank-Werte dynamisch ausgeben Java Basics - Anfänger-Themen 19
B Frage zu Datenbank Design - Rechnungen, Angebote... und deren Positionen Java Basics - Anfänger-Themen 4
B Datenbank: Entity mit vielen Referenzen? Ansatz so ok? Java Basics - Anfänger-Themen 8
T Datenbank | Welche am Sinnvollsten? Java Basics - Anfänger-Themen 5
S Daten speichern, ohne Datenbank Java Basics - Anfänger-Themen 8
L Daten aus ArrayList in Datenbank durchsuchen Java Basics - Anfänger-Themen 5
M Datenbank in jTable Laden Java Basics - Anfänger-Themen 49
M Datenbank verbindung Java Basics - Anfänger-Themen 19
J Java Verbindung mit mysql Datenbank Java Basics - Anfänger-Themen 3
B Datenbank, aktuelle Ende als Zahl an Label übergeben Java Basics - Anfänger-Themen 7
T Collections Geeignete Collection/Liste/Datenbank Java Basics - Anfänger-Themen 17
B Treetable (rekursive Funktion) aufbauen von Datenbank Java Basics - Anfänger-Themen 4
R Input/Output Verbindung mit mySql-Datenbank Java Basics - Anfänger-Themen 9
D Compiler-Fehler Wert auf Datenbank übertragen und Sleep Thread Java Basics - Anfänger-Themen 3
N (Java) Regristrierung und Login System mit einer Datenbank Java Basics - Anfänger-Themen 5
J Datenbank Zugriff Java Basics - Anfänger-Themen 24
J Mit JSF Formular in Datenbank schreiben Java Basics - Anfänger-Themen 3
DaCrazyJavaExpert Verschiede Aktionen der Datenbank getrennt durchführen Java Basics - Anfänger-Themen 4
DaCrazyJavaExpert Datenbank wird nicht erstellt Java Basics - Anfänger-Themen 31
E Daten gehen nicht in Datenbank Java Basics - Anfänger-Themen 14
C JTable update mit MySQL Datenbank Java Basics - Anfänger-Themen 1
Meeresgott OOP Gui, Logik und Datenbank richtig aufbauen Java Basics - Anfänger-Themen 43
B Schreiben von zu vielen Einträgen in einer Datenbank Java Basics - Anfänger-Themen 9
S Datenbank auf Knopfdruck abfragen Java Basics - Anfänger-Themen 8
M Java als Webanwendung mit Datenbank abfrage Java Basics - Anfänger-Themen 3
N Datenbank mit GUI verbinden - Wie? Java Basics - Anfänger-Themen 5
1 Datenbank in Java Java Basics - Anfänger-Themen 1
M Erste Schritte Java Applet - HTML Seiten auslesen und in Access Datenbank schreiben? Java Basics - Anfänger-Themen 15
J Bücher Datenbank Java Basics - Anfänger-Themen 5
S Best Practice MVC und große Datenmengen aus einer mySQL - Datenbank Java Basics - Anfänger-Themen 24
J Datum und Uhrzeit in Datenbank falsch hinterlegt Java Basics - Anfänger-Themen 13
R Erstversuch Datenbank Java Basics - Anfänger-Themen 6
I Daten speichern ohne Datenbank Java Basics - Anfänger-Themen 20
A Erste Schritte Verbindung zu MySQL Datenbank herstellen Java Basics - Anfänger-Themen 7
T Sql Datenbank - variable übergeben? Java Basics - Anfänger-Themen 8
C Passwörter möglichst sicher in Datenbank speichern Java Basics - Anfänger-Themen 18
W Erste Schritte Exceltabelle in Datenbank übertragen mittels XDEV Java Basics - Anfänger-Themen 7
J GUI mit phpMyAdmin Datenbank verbinden Java Basics - Anfänger-Themen 0
K Erste Schritte Datenbank SQL erklärung Java Basics - Anfänger-Themen 15
B Lokale Datenbank Java Java Basics - Anfänger-Themen 2
B Klassen Doppelte werte Filtern XML, Datenbank und DOM Java Basics - Anfänger-Themen 3
Todesbote Int Array mit Hibernate in Datenbank speichern. Java Basics - Anfänger-Themen 2
U Datenbank in Java Java Basics - Anfänger-Themen 8
M Keine Datenbank verbindung Java Basics - Anfänger-Themen 14
N mit Werten aus einer mysql datenbank in java rechnen Java Basics - Anfänger-Themen 17
Q Datenbank nicht über separaten Server Java Basics - Anfänger-Themen 4
B Dateiname in Datenbank schreiben Java Basics - Anfänger-Themen 2
J fortlaufende Objekte durch Variable auswählen; Datenbank Java Basics - Anfänger-Themen 4
S ArrayList in mysql Datenbank speichern Java Basics - Anfänger-Themen 6
C Datenbank - Welche Java Basics - Anfänger-Themen 5
B Java Objektorientierte Datenbank - Assoziation Hilfe Java Basics - Anfänger-Themen 4
G Input/Output Serialisierung oder Datenbank Java Basics - Anfänger-Themen 6
J Erste Schritte Objekte in Datenbank speichern Java Basics - Anfänger-Themen 26
A Android Datenbank gaaanz einfaches Insert geht nicht - warum? Java Basics - Anfänger-Themen 4
L Erste Schritte Datenbank Zugangsdaten sicher? Java Basics - Anfänger-Themen 15
S Input/Output Primzahlen Datenbank Java Basics - Anfänger-Themen 11
B Mit Java-Programm Daten aus MySQL-Datenbank auslesen, lokal und nicht lokal. Java Basics - Anfänger-Themen 10
K Input/Output Datenbank Java Basics - Anfänger-Themen 27
M Datenbank in die Gui Java Basics - Anfänger-Themen 4
J JTable mit Daten aus Datenbank füllen Java Basics - Anfänger-Themen 3
F Erfassung von PCs in eine SQLite-Datenbank über JDBC Java Basics - Anfänger-Themen 9
T Datenbank Abfrage Exception Null Java Basics - Anfänger-Themen 2
M Brauche ich ein Datenbank oder nicht? Java Basics - Anfänger-Themen 6
D JDBC Datenbank fail?! Java Basics - Anfänger-Themen 20
A Problem beim einfügen in eine Datenbank Java Basics - Anfänger-Themen 2
F Classpath Datenbank ... nur wo? Java Basics - Anfänger-Themen 24
H Datenbank suche in kleine Schritte Java Basics - Anfänger-Themen 6
B Personalnummer aus Datenbank Java Basics - Anfänger-Themen 3
M Welche Datenbank? Java Basics - Anfänger-Themen 5
J RadioButtonInhalt in Datenbank übergeben Java Basics - Anfänger-Themen 3
R Datenbank bei Klassenverteilung führt zu NullPointerException Java Basics - Anfänger-Themen 7
J PW von Datenbank wie abspeichern? Java Basics - Anfänger-Themen 2
F Verbindung zu MySql Datenbank Java Basics - Anfänger-Themen 4
MU5T4NG JPasswordField als Hash in Datenbank abspeichern Java Basics - Anfänger-Themen 3
J Kleine Datenbank programmieren Java Basics - Anfänger-Themen 2
J Eigene kleine Datenbank programmieren Java Basics - Anfänger-Themen 2
F Collections Datenbankdaten in einer Map speichern, bearbeiten, sortieren und wieder in Datenbank schreiben Java Basics - Anfänger-Themen 20
T Zugangsdaten für Datenbank in Java-Programm speichern? Java Basics - Anfänger-Themen 5
S Schnittstelle für Datenbank bzw. Dateiformat Java Basics - Anfänger-Themen 2
C ComboBoxModel mit Daten der Datenbank verändern Java Basics - Anfänger-Themen 2
T Datenbank automatisch erzeugen beim ersten Start Java Basics - Anfänger-Themen 6
I Datenbank - nach erster Verbindung keine Verbindung mehr Java Basics - Anfänger-Themen 3
F Datenbank in eine Textdatei speichern Java Basics - Anfänger-Themen 13

Ähnliche Java Themen

Neue Themen


Oben