Wie kann ich den String hashen?


04.07.2022, 10:04

SQL injection ist mir natürlich bewusst, aber da fange ich illegale Charakter gleich bei der Eingabe ab ;)

1 Antwort

Vorerst mal, Stimmt das so? Kann das funktionieren?

Ja, das ist erst mal schon der richtige Weg. Später würde ich noch mit einem zufälligen Salt arbeiten aber zum Testen geht es auch so.

Direkt in Java will ich den hash nicht generieren weil mir das unnötig aufwendig vorkommt.

Bedenke aber, dass HASHBYTES soweit ich das sehe eine MSSQL-Funktion ist. Auf anderen Datenbanken wie MySQL steht das so nicht zur Verfügung. Deshalb würde ich hier eher den Hash im Programm generieren und mich nicht auf einen Datenbank festlegen.

Beim login habe ich vor den (schon gehashten) String des echten passwords mit dem hash der usereingabe des login passwords zu vergleichen. Doch wie mach ich das in SQL?

Na einfach genauso:

"SELECT FROM userdata WHERE username = "+username+" AND password = 'HASHBYTES('SHA2_256', "+input_password+")'"
SQL injection ist mir natürlich bewusst, aber da fange ich illegale Charakter gleich bei der Eingabe ab ;)

Wenn du mit „der Eingabe“ meinst, dass du es im Formular oder in der App abfängst, dann ist das zwar schon ok, reicht aber nicht aus. Gerade wenn Daten über Web-Formulare oder Request kommen, können die natürlich nach Belieben manipuliert werden. Traue niemals externen Daten!

Woher ich das weiß:Berufserfahrung – Entwickle Anwendungen für iOS, iPadOS und macOS beruflich.
CrazyChicken334 
Fragesteller
 04.07.2022, 10:39

Ui OK Danke für die großartige Antwort!

Meine Database ist eine MySQL also kann ich die HASHBYTES eigentlich gleich wieder vergessen, oder? :/

Hättest du eventuell ein funktionierendes Beispiel zum String hashen (am besten SHA-256) -ich glaube das reicht aus, oder?- in Java?

(Ich weiß garnicht wie ich da anfangen soll 👀 ich finde Java manchmal unnötig Aufwendig.)

0
Babelfish  04.07.2022, 10:46
@CrazyChicken334
Meine Database ist eine MySQL also kann ich die HASHBYTES eigentlich gleich wieder vergessen, oder? :/

In MySQL wäre die Funktion:

SHA2('abc', 256)
Hättest du eventuell ein funktionierendes Beispiel zum String hashen (am besten SHA-256) -ich glaube das reicht aus, oder?- in Java?

Also Java ist auch nicht meine Baustelle aber eine Google-Suche liefert u.a. das hier:

https://www.techiedelight.com/generate-sha-256-hashcode-java/

1
CrazyChicken334 
Fragesteller
 04.07.2022, 11:29
@Babelfish

Danke! :D

Also kann ich eigentlich beides mit MySQL machen und muss es nicht wirklich in Java machen, oder? :D

Was ist ein zufälliger Salt? 🤔

0
Babelfish  04.07.2022, 11:52
@CrazyChicken334
Also kann ich eigentlich beides mit MySQL machen und muss es nicht wirklich in Java machen, oder? :D

Ich würde davon abraten, es mit den Datenbank-Funktionen zu machen. Das Ergebnis kann je nach Datenbank und Version unterschiedlich sein und damit die ganze Nutzertabelle unbrauchbar werden. Außerdem wird es mit einem Salt schon schwieriger umzusetzen.

Was ist ein zufälliger Salt?

Suche einfach mal nach den Begriffen „password hash salt rainbow tables“.

Den Salt speicherst du üblicherweise in einer extra Spalte der Datenbanktabelle.

Wie schon gesagt, ist Java nicht meine Baustelle aber hier sind ein paar Beispiele, wie das mit einem Salt funktioniert:

https://howtodoinjava.com/java/java-security/how-to-generate-secure-password-hash-md5-sha-pbkdf2-bcrypt-examples/

1
orochi02  04.07.2022, 19:10
@CrazyChicken334

sha ist absolut nicht ausreichend (aber besser als nix)

wenn es dir halbwegs wichtig ist, gibt es eine bcrypt implementierung für java

2
CrazyChicken334 
Fragesteller
 04.07.2022, 11:50
"SELECT * FROM userdata WHERE username = "+username+" AND password = 'HASHBYTES('SHA2_256', "+input_password+")'"

Achsoo

IG Vergleiche also direkt den Wert als hash mit dem realpasswort als hash mit SQL und quasi nicht mit == in Java :D macht sogar Sinn! :)

Nur was mache ich, wenn es einen Fehler gibt, wie fange ich den dann ab? (es ist als return function login() gedacht)

0
Babelfish  04.07.2022, 11:54
@CrazyChicken334

Welchen Fehler soll es denn geben? Du findest entweder einen Nutzer mit diesem Nutzernamen und diesem Password-Hash oder du findest keinen. Im ersten Fall kann der Nutzer angemeldet werden und im zweiten gibst du eine Fehlermeldung aus, dass die Login-Daten nicht stimmen.

1
CrazyChicken334 
Fragesteller
 04.07.2022, 12:15
@Babelfish

Achso, also kann ich quasi mit ner try and catch probieren die daten zu getten, und wenn keine daten da sind würde es nen error geben, und den catche ich :)

0
Babelfish  04.07.2022, 12:47
@CrazyChicken334

Nein, eigentlich nicht. Du holst Daten über einen Datenbank und bekommst x Datensätze zurück. Bei dir kann x nur 1 oder 0 sein. Wird ein Nutzer mit diesem Passwort gefunden, wird ein Datensatz mit diesem Nutzer zurückgegeben. Wird kein Nutzer gefunden, wird eben kein Datensatz geliefert. Das musst du dann einfach über die entsprechenden Funktionen in Java auswerten. Ein Error wird da aber nicht geworfen.

1