Passwörter möglichst sicher in Datenbank speichern

Curiosus

Mitglied
Hi@all...

Ich bin grade dabei mir einen kleinen Server in Java zu erstellen. An den Server soll man u.a. Daten für eine Registrierung senden können und zu einer Registrierung gehört ja auch üblicherweise ein Passwort. Diese Daten speichert der Server in eine Datenbank, um sie später beim Login gegenzuchecken. In PHP habe ich zum speichern der PW's in einer Datenbank immer den Blowfish-Algorithmus zum verschlüsseln der PW's genutzt aber der Algo In PHP erzeugt einen Hash und in Java wird eine Verschlüsselung erzeugt, die dementsprechend auch wieder entschlüsselt werden kann, was ja dann irgendwie eine kleine Sicherheitslücke ist. Desweiteren ist der Blowfish-Algo in Java auch bedeutent schneller als der in PHP, was auch Brute-Furce- und Dictionary-Angriffe begünstigt.
Jetzt wollte ich mal fragen, was eine möglichst sichere Methode ist PW's in einer Datenbank zu speichern? Ich hoffe hier kennt sich jemand damit aus und kann mir möglicherweise weiterhelfen.
 
L

lenuyx

Gast
hi,

nur ne kleine Zwischenfrage: ich habe mal gehört das man für Datenbanken MD5 verwendet ist das richtig?

siehe hier(wiki)
 
Zuletzt bearbeitet von einem Moderator:

JavaMeister

Gesperrter Benutzer
Bei google findet man weder zu der Frage nach dem verwendeten Algo noch etwas zu Tipps und Tricks, wie man pws in der DB hasht?

Habt ihr beiden auch mal vorher selbstständig die sufu oder google bemüht, oder das nächst beste Forum befragt? :applaus:

Ihr beiden kommt etwas unmotiviert rüber.

Suche die Antwort und stelle dazu Fragen.
 
L

lenuyx

Gast
ok vielleicht brauchst du eine genauere Umschreibung meine Frage:

MD5 ist laut wiki(keine allg. gültige quelle) unter anderem eine Methode zum verschlüsseln von Passwörtern. MD5 ist laut wiki relativ alt.
Ist MD5, in heutiger Betrachtung, die beste bzw. effizienteste und am häufigsten genutzte Methode um Passwörter zu speichern?

falls dir diese Frage immernoch nicht recht ist solltest du evtl. mal den Zweck von Fragen analysieren.
 

JavaMeister

Gesperrter Benutzer
Seit wann ist den Wiki keine allg. gültige Quelle? - Wiki nennt alle Quellen für die dort getroffenen Aussagen und auch eine Liste weiterführender Literatur.

Klar ist MD5 alt.

Alle gängigen verschlüsselungen/hashalogs sind alt. Der Trick ist die Schlüssellänge entsprechend anzupassen und schon geht es ;)

Und wie man es heute macht, kann man binnen sekunden bei google erfragen.

Nicht jede Frage hat ihre Daseinsberechtigung, nur weil es eine Frage ist.

Zum Beispiel frage ich ja nicht, wie ich eclipse starten kann oder? Oder was eine Datenbank ist. Oder wo ich Bücher kaufen kann. Gibt genug Beispiele deine Frage gehört dazu. (Sorry)
 
L

lenuyx

Gast
Und ich glaube, nachbem ich mehrere deiner Post gelesen habe das du fasst alles was DU als selbstverständlich ansiehst mit einer Art kommentierst die nicht hilfreich sondern eher herablassend ist.

Überlege dir bitte ob du in Zukunft so weiter verfahren möchtest denn die Art von Kommunikation wird sich nicht durchsetzten.

wäre es so schwer dem Fragesteller die Antwort aus deinem Wissen zu vermitteln? natürlich kann man zusätzlich noch hinweisen das es sehr leicht ist zusätzliche Antworten via Google etc. zu finden.

mfg
 

JavaMeister

Gesperrter Benutzer
Die korrekte Lösung hier ist, den Fragestelle die METHODE beizubringen und nicht die Antwort zu geben.

Wenn du einem Fremden ein Stück Brot gibst, dann ist er paar Stunden satt. Wenn du ihm stattdessen beibringst, wie man Brot backt, kann er sich selber ernähren. Oder?

Wenn Dir meine Antworten nciht gefallen, dann lese sie nicht. Oder poste die Antwort, die du für richtig hällst.

Oder lass andere eine bessere Antwort posten. Verstehe nicht, wieso ich darüber diskutieren muss.
 

Curiosus

Mitglied
nur ne kleine Zwischenfrage: ich habe mal gehört das man für Datenbanken MD5 verwendet ist das richtig?

Nein, man sollte keine MD5-Hashes von PW's in DB's speichern, da dieser Algorithmus einfach zu schnell ist und es dafür auch zu viele vorberechnete Rainbow-Tables gibt.

OK, ich habe auch schon ein wenig gegoogelt und wie es aussieht ist SCrypt so ziemlich das was ich suche... Wenn ich allerdings bei google "Java SCrypt" eingebe, dann werde ich nur mit Javascript zugemüllt ^^ (die Eingabe "SCrypt Java" liefert die selben Ergebnisse).

Dann Frag ich einfach mal hier. Wo finde ich die SCrypt-Lib für Java und bestenfalls noch eine Art Tutorial oder so in dem erklärt wird, wie man diese anwendet?

P.S.: Bitte nich streiten, wir ham uns doch alle lieb. =)
 
Zuletzt bearbeitet:
L

lenuyx

Gast
musst du nicht ;)

bitte lese richtig. ich habe geschrieben das es wichtig und richtig wäre ihm die Lösung zu geben und einen Verweis auf andere Quellen.
 

Curiosus

Mitglied
OK, SHA-512 allein ist ja jetzt nicht sooo... sicher. Das kann bei schwachen PW's immer noch recht schnell mit Dictionary-Attaken geknackt werden. Deswegen frage ich dazu einfach mal, ob es reichen würde, noch einen SALT mit anzufügen und den SHA-512-Algo in einer Schleife mehrmahls durchlaufen zu lassen, damit ein potentieller Angreifer bei z.B. Bruteforce-Angriffen etwas ausgebremst wird.

Dort steht ein Link zur Java implementierung:

https://github.com/wg/scrypt
Oha, den Link hab ich doch glatt übersehen :oops:

Hat hier zufällig schon jemand erfahrungen mit scrypt gemacht?
 
Zuletzt bearbeitet:

JavaMeister

Gesperrter Benutzer
1. Du unterstellst hier, dass jemand deine Anwendung via Bruteforce hacken möchte.

Sei unbesorgt. Niemand interessiert sich dafür.

2. Selbst mit One-Time Pad Verschlüsselung wirst du Dictionary-Attacken nicht sicher.

Wenn ich als PW "a" nehme, dann brauche ich nur das zu schreiben, egal wie toll dein hashing ist.

hier gilt es KOLLISIONEN zu vermeiden.
 

Curiosus

Mitglied
Sei unbesorgt. Niemand interessiert sich dafür.
Niemand interessiert sich für Passwörter? Heißt das, ich kann sie problemlos unverschlüsselt speichern?

Wenn ich als PW "a" nehme, dann brauche ich nur das zu schreiben, egal wie toll dein hashing ist.
Wenn jemand das PW "a" nutzt und ich als salt ein "B}2O¨cåù+¹o" anhänge und daraus einen Hash erstelle, dann brauch der Angreifer nur auf "a" testen und der Hash-Wert von "a" ist dann der gleiche wie von "a" + "B}2O¨cåù+¹o"? Ist dann der Hash-Wert von allen existierenden Zeichenketten immer gleich?

Sorry für den Sarkasmus allerdings bin ich der Meinung, das es nicht verkehrt ist etwas mehr Wert auf Sicherheit zu legen. Allerdings implizieren das deine Aussagen irgendwie. Mag sein dass sich niemand für meine Anwendungen interessiert aber es kann doch nicht so verkehrt sein, für den vieleicht unwahrscheinlichen aber dennoch möglichen Fall, Sicherheitsvorkehrungen zu treffen.
 

rme

Top Contributor
"JavaMeister", ich finde deine herablassende Art auch nicht gerade zuträglich für ein gutes Diskussionsklima, vorsichtig gesagt.

Aber zum Thema. Man möchte sich üblicherweise gegen drei Attacken wehren:

1. Brute-Force-Angriffe. Der Angreifer probiert wahllos Passwörter und kennt den gespeicherten Wert der Datenbank nicht. Hier ist ein einfaches Mittel, bei einigen Fehlversuchen eine Wartezeit einzubauen, z.B. 30 Sekunden beim 3. Fehlversuch, danach für jeden weiteren Fehlversuch 10 Sekunden mehr oder so.

2. Dictionary-Angriffe: Der Angreifer probiert Passwörter, die woanders bei anderen Leuten gültig waren, kennt aber die Datenbank nicht. Der Schutz funktioniert genau wie bei 1.

3. Kompromittierte Datenbank: Der Angreifer kennt die gesamte Datenbank, also auch die Hash-Werte. Hier benutzen Angreifer bei Hash-Verfahren üblicherweise Rainbow-Tables; das ist eine effiziente Art, viele Hash-Werte in einer Datenstruktur zu speichern, um dann darin ausgehende vom Hash nach dem Klartext zu suchen. Salting ist ein sehr einfaches Mittel dagegen. Die Angriffe 1 und 2 sind jetzt weiterhin möglich, allerdings kann der Angreifer nun die programmtechnische Zeitspanne umgehen und viel schneller prüfen. Hiergegen hilft die Verwendung eines teuren (im Sinne von Zeit oder Speicher) Verfahrens wie scrypt oder die Anwendung von normalen Hash-Verfahren in einer Schleife, um die Zeit zu erhöhen.
 

Curiosus

Mitglied
@rme dankeschön für deine ausführliche Antwort.

Dann möchte ich dich nur mal kurz noch nach deiner persönlichen Meinung fragen:
Würdest du einen SHA-512-Hash mit Salt und mehreren Schleifen-Durchläufen vorziehen, oder empfihlst du ehr die Nutzung der Scrypt-Library?
 

rme

Top Contributor
Ich habe mich mit scrypt noch nicht befasst und kann es daher nicht einschätzen, muss ich gestehen. Im Gegensatz zur SHA-Familie ist scrypt noch kaum wissenschaftlich untersucht, außerdem hat er viele Parameter und besteht aus der Anwendung mehrerer anderer Algorithmen - vom "Bauchgefühl" her würde ich ihn eher ungern einsetzen, weil es bisher so war, dass die ganz einfachen Algorithmen in der Praxis gegen die komplexeren gesiegt haben, weil die Komplexität doch irgendwann für Sicherheitsprobleme gesorgt hat. Aber das ist natürlich eine völlig subjektive Meinung :)

Man könnte es glaube ich so sehen: Gegen wen willst du dich schützen?

Script-Kiddies, die zufällig an deine Datenbank gelangen und hoffen, möglichst schnell an gültige Daten zu kommen: Da hilft Hash + Salting.

Jemand, der gezielt deine Datenbank angreift, weil er die Daten eines bestimmten Nutzers haben will und dafür viel Aufwand betreibt: Ab hier wird ein teures Verfahren wichtig. Bevor man sich etwas eigenes ausdenkt, ohne Erfahrung damit zu haben, sollte man dann doch eher scrypt vorziehen - schlimmer als die eigene Idee wird es nicht sein.
 

Curiosus

Mitglied
schlimmer als die eigene Idee wird es nicht sein

Schön gesagt ^^

OK, dann werd ich mich mal ein wenig in scrypt einarbeiten. Sobald irgendwelche gefährlichen Sicherheitslücken bekannt werden, werde ich sowieso einen neuen Algorithmus implementieren.

Nochmals dankeschön für deine Antwort :)
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
M Passwörter vergleichen funktioniert nicht Java Basics - Anfänger-Themen 3
D Passwörter sicher speichern Java Basics - Anfänger-Themen 2
Da_Tebe Passwörter verstecken Java Basics - Anfänger-Themen 6
Helgon Wo Passwörter speichern Java Basics - Anfänger-Themen 17
C Passwörter & Java Java Basics - Anfänger-Themen 5
L Zeichenlänge bei Passwörter? getText() ersetzen durch? Java Basics - Anfänger-Themen 2
P Länge des längsten möglichst klein Java Basics - Anfänger-Themen 2
J Array eintrag mit möglichst wenig code lösen Java Basics - Anfänger-Themen 16
O equals Methode möglichst effizient Java Basics - Anfänger-Themen 13
M Array in ein Array übertragen (möglichst einfach) Java Basics - Anfänger-Themen 6
S World-Datei möglichst klein speichern? Java Basics - Anfänger-Themen 5
E JMC - Dlls einbinden - möglichst einfach Java Basics - Anfänger-Themen 8
F 1:1 kopie möglichst effektiv und schnell Java Basics - Anfänger-Themen 7
S Code richtig / besser machbar? (Nicht sicher, ob Code selbst falsch ist) Java Basics - Anfänger-Themen 4
F Thread der auf eine Queue wartet, sicher beenden Java Basics - Anfänger-Themen 4
M Wie sicher sind Daten im Java Programm? Java Basics - Anfänger-Themen 9
M Warum ist Maven als Technologie eigentlich so sicher? Java Basics - Anfänger-Themen 0
T String simpel aber sicher verschlüsseln Java Basics - Anfänger-Themen 5
L Erste Schritte Datenbank Zugangsdaten sicher? Java Basics - Anfänger-Themen 15
T Die Zukunft von Java Applets sicher? Java Basics - Anfänger-Themen 15
D Status sicher - JCheckbox Java Basics - Anfänger-Themen 4
A Klassen ArrayList richtig / sicher Casten? Java Basics - Anfänger-Themen 3
V Java Jar sicher ? Java Basics - Anfänger-Themen 66
J ListModel dynamisch und schnell aber sicher ändern Java Basics - Anfänger-Themen 7
M Serialisieren beim Schließen des Progs sicher beenden Java Basics - Anfänger-Themen 4

Ähnliche Java Themen

Neue Themen


Oben