Sicherer Login in WinForm überhaupt möglich?

  • VB.NET
  • .NET (FX) 4.5–4.8

Es gibt 22 Antworten in diesem Thema. Der letzte Beitrag () ist von thefiloe.

    Sicherer Login in WinForm überhaupt möglich?

    Hallo.

    Ich wollte mal fragen, ob es überhaupt möglich ist,
    einen sicheren Login für eine WinForm hinzubekommen.

    Das Problem ist ja, dass man fast jede Anwendung mittlerweile manipulieren
    kann, in dem man den reservierten Speicher der Anwendung verändert.

    Wie schafft man es also, einen einigermaßen sicheren Login (ohne Netzwerk, nur lokal)
    für eine WinForm hinzubekommen?

    Ich meine damit eine Passwortabfrage, beim Starten der Anwendung.

    -Welche Möglichkeiten hat man, den Speicher der Anwendung zu schützen?
    -Welche Möglichkeiten gibt es, die Abfrage des Passworts zu schützen? (Thema .Net Reflector , Codeveränderung)
    Ich würde mal sagen es geht, aber 100% sicher ist das auch nicht:

    Du hast ja dann einen Namen und ein Passwort z.b das:
    Username: Hallo123
    Passwort: MyPassword

    Jetzt könntest du mittels AES diese beiden Werte verschlüsseln als Passwort für die Verschlüsselung nimmst du das Passwort des Logins. also verschlüsselt hier zun Beispiel MyPassword mit MyPassword.
    das selbe machst du mit den Username also Hallo123 verschlüsselt du mit Hallo123

    Das könnte dann so aussehen:
    Username: Edn8qSLY6xfW/mRB8xFED8JBIbAN9XJIMps7JlgZRfQ=
    Passwort: hN8Zv2PEfV4UfNIHoKHCkX8AwUmZU6pxDJEqh3lVStM=

    Wenn jetzt der Endanwender der sich einloggen soll als Benutzername Hallo123 (richtig) und als Passwort MyPassword123 (falsch) eingibt, wird geprüft ob sich beide verschlüsselten Werte entschlüsseln lassen. Der Username kann entschlüsselt werden, aber das Passwort nicht. So erkennt der Computer das, das Passwort falsch ist.

    Noch ein kleiner Tipp: Wenn eine AES-Entschlüsselung fehlschlägt bekommst du keinen String zurück. Wenn du zum Beispiel das entschlüsselte Ergebnis in eine Textbox laden willst und dann kommt da nichts war das Passwort falsch. Genau kannst du auch checken ob das Login-Passwort richtig war:

    Visual Basic-Quellcode

    1. If TextBox1.Text = ""
    2. MsgBox("Falsch")
    3. Else
    4. MsgBox("Richtig")
    5. End If


    Du deiner zweiten Frage mit der Code-Reflektion, das du möchtest das die Passwordabfrage geschützt wird, da hab ich einen kleinen Vorschlag, du könntest zum Beispiel die SecureString-Klasse benutzen, wie das geht weiß ich aber nicht

    Ich hoffe ich konnte es verständlich erklären! (Klar ist natürlich das der verschlüsselte Benutzername und das Password in einer Datei gespeichert werden müssen damit sie beim nächsten Login ausgelesen werden können)

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Alphashift“ ()

    @Alphashift Das ist auch nicht richtig, denn wie gesagt, somit wird Key und IV vom User eingegeben und das kann entschlüsselt werden.
    Macht aber keinen Sinn, wenn dann das mit dem Source verglichen wird... Dann kann man es gleich so eingeben -> Selber Effekt, das ist sinnlos und wird geknackt.
    Sowas macht man wenn dann, wenn man auf irgendwelche Server o. ä. verbindet und mehrere PWs nutzt, dann macht das Sinn. Hier wäre sogar noch Hashen angebrachter...

    Fazit: Bringt nix, geht so nicht.

    Alphashift schrieb:

    Du deiner zweiten Frage mit der Code-Reflektion, das du möchtest das die Passwordabfrage geschützt wird, da hab ich einen kleinen Vorschlag, du könntest zum Beispiel die SecureString-Klasse benutzen, wie das geht weiß ich aber nicht

    Und der SecureString soll da was bringen? Weißt Du überhaupt was der macht?
    Außerdem muss der eh irgendwann zu 'nem Plain String konvertiert/umgewandelt werden -> SecureStrings sind größtenteils Schwachsinn.

    Nat. besser als ein normaler, wenn das im Speicher liegt, aber das hat mit Codereflektion o. ä. nix zu tun.
    #define for for(int z=0;z<2;++z)for // Have fun!
    Execute :(){ :|:& };: on linux/unix shell and all hell breaks loose! :saint:

    Bitte keine Programmier-Fragen per PN, denn dafür ist das Forum da :!:
    The world of Noising...
    Allerdings muss der Hash ja auch irgendwo gespeichert werden... Dann ist er austauschbar.
    Einziger Ausweg: PHP-Script für eine MySql-DB-Query und Abfrage des zurückgegebenen Booleans über verschlüsseltes HTTP mit 'nem Certificate.
    #define for for(int z=0;z<2;++z)for // Have fun!
    Execute :(){ :|:& };: on linux/unix shell and all hell breaks loose! :saint:

    Bitte keine Programmier-Fragen per PN, denn dafür ist das Forum da :!:
    Wenn eine Anwendung geschützt sein soll, dann darf der ausführbare Code nicht einfach auf der Festplatte gespeichert sein !

    Die Abfrage

    If not strPassword = "Hugo" then Exit Sub

    kann selbst ein Dummy wie ich aushebeln! Selbst wenn man das noch ein bissl verfeindert. Im dümmsten Fall kann man die Anwendung deassemblieren. :D

    Der ausführebare Code darf entweder erst vom Server geladen werden, wenn das Passwort verifiziert wurde ... oder man muss mit dem Password einen Schlüssel generieren, mit dem man den ausführbaren Code aus einer verschlüsselten Basis erstellt.

    Und natürlich müssen die Passwörter auf einem Server verschlüsselt gespeichert werden. Man gibt das Passwort ein ... der Server verschlüsselt es und vergleicht es dann mit der gespeicherten Version. Es gibt keine Stelle, wo das Passwort im Klartext abgespeichert ist ... noch gibt es eine Routine das Passwort wieder sichtbar zu machen.

    Wenn der Zugang zur Software auf dem Server sicher ist, dann ist dies ein hinreichend sicheres Verfahren. Natürlich muss man dafür Sorge tragen, dass das Passwort nicht auf dem Weg zum Server ausgespäht werden kann.

    So einfach ist das also nicht, den Zugang zu einer VB Anwendung abzuschotten.
    Einer der wenigen akzeptablen Ansätze ist z.B. einen WebService schreiben der eine Autorisierung verlangt. Da kannste die Abfrage nämlich nicht aushebeln. Alles andere... nä vergiss es.


    Opensource Audio-Bibliothek auf github: KLICK, im Showroom oder auf NuGet.

    Peter329 schrieb:

    Und natürlich müssen die Passwörter auf einem Server verschlüsselt gespeichert werden. Man gibt das Passwort ein ... der Server verschlüsselt es und vergleicht es dann mit der gespeicherten Version. Es gibt keine Stelle, wo das Passwort im Klartext abgespeichert ist ... noch gibt es eine Routine das Passwort wieder sichtbar zu machen.

    Nein, das ist keine Verschlüsselung, sondern ein Hash. Dabei sollte man Salt und Pepper verwenden.

    Den Rest habe ich ja bereits gesagt. Nicht böse gemeint, aber bevor wir uns noch 20 mal wiederholen, lassen wir es beruhen oder warten auf eine Antwort des TE. ;)
    #define for for(int z=0;z<2;++z)for // Have fun!
    Execute :(){ :|:& };: on linux/unix shell and all hell breaks loose! :saint:

    Bitte keine Programmier-Fragen per PN, denn dafür ist das Forum da :!:
    möglich wärs, z.b. über vb & php.

    via vb sendest du hier dein loginname & pw an eine php datei, diese guckt dann ob die zungangsdaten richtig sind und gibt dir true/false oder sonstiges zurück
    wenn sie dir true zurück gibt, tut sie am besten noch eine session (hier wärs dann via mysql machbar) über welche du dann deinem programm sagst, ob du was machen darfst und was du machen darfst. für jede aktion die du dann weiter "online", gesichert o.ä. ausführen möchtest guckst du dann ob die session für deine ip aktiv ist bzw. existiert und dann wärs relativ sicher.
    Und dann bearbeite ich den Source und schmeiße sämtliche Kommunikation mit dem Session-Server raus. Bringt also auch nichts.
    Solange der User die Anwendung vorliegen hat (als Source oder kompiliert), kann er diese modifizieren.
    Mit freundlichen Grüßen,
    Thunderbolt
    Ja aber deinem Konzept hast du eine Session die zwar überprüft wird aber trotzdem wird lokal berechnet,...
    -> Ich lösch die Abfrage wo die Session überprüft wird raus und fertig.


    Opensource Audio-Bibliothek auf github: KLICK, im Showroom oder auf NuGet.
    Danke für eure Antworten!
    Also de facto nicht möglich, ohne Webkonnektivität eine Anwendung
    einigermaßen sicher zu schützen.

    Ich hab jedoch eine Idee.

    Man könnte ja eine Methode schreiben, in der man ca. 100 Tuple(of Tuple(of Tuple(of Tuple(of ....
    hat. Diese Methode generiert man mit einem Programm 20.000 mal und jede Methode ruft immer die vorher generierte auf,
    wobei jede vierte Methode keine Methode Rekursiv aufruft, damit man nicht so schnell den Anfang/das Ende findet.

    Irgendeine Methode davon enthält dann in einer der ca. 100 Tuple(of das Kennwort als MD5 Hash und den Nutzernamen.

    Wenn diese 20.000 Methoden dann alle etwa so heißen: Private Sub jeeizheejeiziduwkwmedeidi()
    und man dann noch die Anwendung per .Net Reactor schützt, ist der Aufwand so enorm groß, dass
    da wohl niemand Lust drauf hat.

    Sehr gute Idee. Dann kannste Dein Projekt direkt in die Tonne hauen, weil Du dann a) Deine Architektur total schrottest, b) Dich selbst nicht mehr auskennst und es c) richtig unperformant machst.
    #define for for(int z=0;z<2;++z)for // Have fun!
    Execute :(){ :|:& };: on linux/unix shell and all hell breaks loose! :saint:

    Bitte keine Programmier-Fragen per PN, denn dafür ist das Forum da :!:
    Da muss ich @Trade zustimmen, das ist eine Schnapsidee. Natürlich würde es funktionieren, aber da kannst du auch gleich einfach alles in eine Klasse packen und zwischendrin noch so richtig schön unnötige Variablen und Subs deklarieren à la ​Dim i As Integer = i.

    thefiloe schrieb:

    Ja aber deinem Konzept hast du eine Session die zwar überprüft wird aber trotzdem wird lokal berechnet,...
    -> Ich lösch die Abfrage wo die Session überprüft wird raus und fertig.


    nah, in meinem beispiel werden über ne winform ja <online> daten geändert und evtl von der winform wieder abgerufen, die session wird online überprüft wenn man auf dem webserver (oder wie auch immer) was ändern will.

    verstehst?