C# Richtiges Übermitteln von Passwörtern

TLS funktioniert auch ohne signiertes Zertifikat. Allerdings weiß der Client dann nicht, ob der Server vertrauenswürdig ist. Wenn du eine App schreibst, sollte das relativ egal sein, weil die Warnung keiner sieht. Wenn man aber mit dem Browser die Seite aufruft, dann werden 99% der Nutzer keinen Schritt weiter gehen, eben wegen dieser Warnung.

Ein "echtes" Zertifikat gibt's aber kostenlos. Z.B. bei letsencrypt.

Für localhost Experimente kannst du dir aber auch einfach selbst ein TLS Schlüsselpaar erstellen.
 
Bei dem selbst signierten und erstellten Zertifikat musst du dies dann natürlich in deine Anwendung implementieren damit deine App dies als vertrauenswürdig und bekannt anerkennt. Dann gibt es auch keine Fehlermeldung.

Ansonsten versuche bitte nicht das Rad neu zu erfinden. So Dinge wie direkt in eine DB schreiben macht man einfach nicht. Unsicher, enormer Overhead, nicht zielführend. Du bist ja nicht der erste Mensch der $Anwendung programmieren soll mit einem DB-Backend. Es gibt nicht ohne Grund Best Practices und Standards die sich etabliert haben.

Jetzt zu Beginn ist der Lernaufwand ggf. höher eine direkt sichere Anwendung zu designen aber lieber so herum und dann für den Rest deines Lebens mit Blick auf Sicherheit programmieren als irgendeinen Schund zusammen zu frickeln und danach(!), sprich nach Fertigstellung der Software sich um Sicherheit zu kümmern und TLS, Verschlüsselung usw nachträglich hinzuzufügen.
Spätestens sobald andere Nutzer deine Anwendung (jetzt oder zukünftige) nutzen sollen bist du für diese Daten verantwortlich. Ein Thema das viele leider viel zu gerne und zu leicht ignorieren oder auf so Dinge kommen wie Kryptografie selbst zu entwickeln anstatt fertige, getestete und bewährte Lösungen einzusetzen.
 
Noch eine Kleinigkeit die mir gerade aufgefallen ist....
Sollte man auch für die Datenbank TLS benutzen oder ist das mehr oder weniger egal?

Nach vielen rumgecode habe ich jetzt endlich die Verbindung etabliert ^_^ und mache jetzt auch POST und keine GET Anfragen mehr.
 
Zwischen Server und DB brauchst du das nicht, wenn die DB so eingerichtet ist, dass sie nur von der IP des Servers aus erreichbar ist.
 
Ah gut, hab ich mir gedacht aber Fragen kostet ja nichts.
Aber noch eine Frage: Ich dachte eigentlich ich kriegs hin aber wie genau benutzt man jetzt bcrypt für tomcat server?
ich hab im maven repository gesucht und auch was importiert aber die Doku beginnt mit var bcrypt = require(...)
und Java kennt offenbar weder das var noch das require und was ich importieren soll weiß ich auch nicht. Ich habs mit cljsjs probiert aber ich glaube das ist vielleicht garkein Java sondern nur Javascript.
 
mit

Code:
BCrypt.hashpw("passwort", BCrypt.gensalt(12));

kannst du ein passwort hashen und mit

Code:
BCrypt.checkpw("passwort", gespeicherter_hash_aus_db);

prüft du, ob das Passwort stimmt.

Dies musst du in deiner Applikation welche am Tomcat läuft implementieren.
 
okay das Problem war, ich hatte das falsche Paket. Ich hab jetzt JBCrypt und vorher hatte ich nur BCrypt. Ich hab mir iwas mit Version 3.x geholt weil mir die Version 0.4 der sonstigen abgeschreckt hatte ^^ Anfängerfehler.
 
Version 0.x heißt nicht generell, dass es schlecht ist. Manche Projekte wie z.B. Apache Kafka werden seit Jahren produktiv eingesetzt und haben erst vor einem Monat Version 1.0 rausgebracht :D
 
Ja aber du musst zugeben da gibts ein System :P Heißt ja nicht umsonst Beta Version^^
 
Nein, eigentlich gibt's da kein System. Jeder macht das wie er will :D

Bei manchen Projekten wird z.B. gesagt: "ungerade Nummer = beta, gerade Nummer = final"

Bei den Spring Projekten sieht das z.B. so aus:
x.y.z SNAPSHOT (=aktueller Entwicklungsstand , möglicherweise komplett unbrauchbar)
x.y.z M1 (=Milestone 1 , also quasi beta)
x.y.z RC1 (=Release Candidate 1 , also fast fertig)
x.y.z RELEASE (=fertige Version)
Da steht halt hinten dran, ob es beta ist oder nicht.

Vor allem landen Betas "normalerweise" nicht im Maven Central Repository: https://mvnrepository.com/artifact/org.mindrot/jbcrypt

Und gerade kleine 1-Mann Projekte erreichen oft nie die 1.0, aber sind trotzdem als "fertig" anzusehen.

Eigentlich muss man da wirklich bei jedem Projekt nachsehen wie die es handhaben, um Gewissheit zu haben :D
 
Okay ich könnte jetzt etwas detailiertere Hilfe gebrauchen. UNdzwar: Wie beschleunige ich die ganze Geschichte?
ich hab ne Zugriffszeit von 3 Sekunden um 100 Zeilen abzurufen in denen je ein char steht. Das ist ziemlich abartig.
Vor allem da ich über WLAN drinne bin, aber selbst wenn ich ist das nichtmal ein Kilobyte, was da drin stehen dürfte.

Hier mal mein Code, ob das was hilft, keine Ahnung.

byte[] byteArray = Encoding.UTF8.GetBytes(query);
WebRequest webRequest = WebRequest.Create(uri);
webRequest.Method = "POST";
webRequest.ContentType = "application/x-www-form-urlencoded";
Stream dataStream = webRequest.GetRequestStream();
dataStream.Write(byteArray, 0, byteArray.Length);
dataStream.Close();
WebResponse webResponse = webRequest.GetResponse();
using (StreamReader reader = new StreamReader(webResponse.GetResponseStream(), Encoding.UTF8))
{
return reader.ReadToEnd();
}

PS: man erkläre mir bitte wie man hier code einfügt. :)
 
Hast du mal geschaut wo der Flaschenhals ist?

Lass dir bei dem Code einfach mal zwischen jeder Zeile einen Timestamp ausgeben.

Keine Ahnung wie das in der Sprache aussieht. Aber in etwa so:

Code:
long timestamp = Timestamp.now().toLong();
byte[] byteArray = Encoding.UTF8.GetBytes(query);
log(Timestamp.now().toLong() - timestamp); timestamp = Timestamp.now().toLong();
WebRequest webRequest = WebRequest.Create(uri);
log(Timestamp.now().toLong() - timestamp); timestamp = Timestamp.now().toLong();
webRequest.Method = "POST";
log(Timestamp.now().toLong() - timestamp); timestamp = Timestamp.now().toLong();
...

Dann solltest du in der Debug Console sehen können, an welcher Zeile es hängt.

Zusätzlich wäre es sehr praktisch, wenn du mal schaust, ob die Antwort an den Client wirklich nur 100 Zeichen lang ist. Oder ob es nicht doch 10 Megabyte voll mit Leerzeichen sind oder so.

EDIT: Und Code ganz einfach mit
Code:
[ CODE] foo [ /CODE] <- Leerzeichen im Tag jeweils entfernen
 
Also log funktioniert ja leider nicht da ich mnit android arbeite aber ich weiß schon wie ich die Zeit logge.
Ich habs jetzt erstmal am Server gemacht und da beträgt die Antwortzeit nur 0.23s
das heißt entweder dauert der Verbindungsaufbau im Server zu lang oder das schreiben des data streams. Am Server liegt es zumindest nicht. komisch oder?
 
Nein, das ist eher typisch^^ In der Regel hast du selten Performance-Engpässe in der Infrastruktur oder dem Server-Backend sondern sehr oft am Endgerät oder dem Frontend der Software :D
Wobei ich ehrlicherweise sage, dass ich weniger der Entwickler als mehr im Bereich Administration/DevOps/Security unterwegs bin und da regelmäßig mitbekomme welche Sauereien so manche Devs verbrechen, teils aus Unwissen, teils Unfähigkeit und teils Faulheit.
 
Dann check mal irgendwie ob die Antwort wirklich nur 100 Zeichen enthält. Vielleicht ist sie auch 100mb groß und deswegen wird's so langsam.

Natürlich funktioniert Logging bei der Android Entwicklung. Wenn du da gar nicht weiter kommst, lässt du dir die Zeiten einfach direkt in deiner App ausgeben. Ist ja im Endeffekt egal, ob die nun in irgendeiner Konsole stehen oder auf dem Handy Display, Hauptsache du kannst sie sehen.
 
Also ich kenne keine Log-Funktion beim Handy. Sowas gibts bei Unity aber nicht bei Xamablöd XD

Aber gut. Ich habs jetzt mal so gemacht und was am allermeisten frisst ist die Funktion GetRequestStream mit 21 Sekunden... wtf? wird ja immer mehr!
danach kommt GetResponseStream mit immerhin 0.6 Sekunden. Der Rest ist vernachlässigbar. Und es ist NUR diese Funktion. also nicht die vorherigen initalisierungen mit oder so.

Ergänzung:
Ich hab jetzt schon diverse Dinge vorgenommen: Proxyerkennung ausgeschaltet, maximale Verbindungen erhöhen, das ganze Zeug nochmal als Task zwecks Multithreading gemacht irgendeine "Expect100Continue" Eigenschaft falsizifizert und ein paar Timeouts auf 1000 gesetzt.
Nichts.

Kann mir mal irgendjemand sagen warum so ein Programm so lange für etwas braucht dass ich im browser in 1 Sekunde schaffe? Ich habs mal mit nem Online Post Request Tool gemacht und sogar da gehts problemlos.
Kennt ihrv ielleciht andere Klassen die das schneller hinkriegen?
Wir redenj a hier über keine vernachlässigbaren Millisekunden wir sind jetzt bei 20 Sekunden und da hört der Spaß auf.
 
Zuletzt bearbeitet:
Also einen leeren Proxy hab ich ja schon gesetzt. Und die using Komponente noch ein bischen zu erweitern habe ich gerade veruscht. Das Ergebnis war nicht sehr erbaulich im gegenteil. damit wurde es sogar zu 50% langsamer. yeii.
um nochmal auf Nummer Sicher zu gehen hab ich den Code 1:1 kopiert - null Gewinn.
Das blöde bei Xamarin ist die Typen können nur einen Satz fehlerfrei sprechen und der ist: "Wir konnten das Problem nicht reproduzieren." >.>

Könnte das Problem vielleicht an der SSL-Verbindung liegen?
 
Zuletzt bearbeitet:
Möglich ist es. Versuch's doch einfach mal ohne SSL / TLS. ;)
 
Zurück
Oben