Passwörter in Programmen so gut wie möglich verschlüsseln

  • VB.NET

Es gibt 13 Antworten in diesem Thema. Der letzte Beitrag () ist von petaod.

    Passwörter in Programmen so gut wie möglich verschlüsseln

    Hi! Klar, Passwörter für z.B. FTP Logins in einem Programm zu definieren ist eine sehr einfache Methode für andere diese einfach auszulesen. (Dekompilieren,...)
    Aber trotzdem möchte ich mal aus Interesse fragen, wie man diese bestmöglich verschlüsseln kann. Angenommen ich würde ein String in ASCII verschlüsseln, wäre dieser kein großes Hinderniss für andere.
    Mit einem Obfuscator kann man soweit ich weiß ein ganzes Programm an sich verschlüsseln. Was wäre ein guter, kostenloser (?) Obfuscator? Wäre mein Code dann wirklich sicher vor anderen?


    Lg Louis :D

    ╔══╦═╦╦╦═╦══╦══╦╗╔╦═╦╦═╦══╗
    ║║║║╩╠..╣╦╬╗╚╬╗╔╣╚╝║╠║║║╠╗╚╣
    ╚╩╩╩╩╩╩╩═╩══╝╚╝╚══╩═╩╩═╩══╝
    Du wirfst da viele Dinge durcheinander, ASCII ist keine Verschlüsselung und ein Obfuscator hilft dir genauso wenig. Wenn dein Anwendung läuft kann man das Passwort ohne Probleme aus dem Arbeitsspeicher auslesen.
    Es gibt keine zuverlässige Methode, Passwörter gehören nicht in den Quellcode!
    Die Guten sind nicht kostenlos. Und nein dein Code ist nie sicher vor anderen. Aber damit würdest du denke ich zumindest einen gewissen Teil ausgrenzen.
    Generell gilt immer, jeder Code am Client ist unsicher. Passwörter im Programm sind einfach immer ein Fehldesign/Sicherheitslücke, es sei denn es ist dir nicht wichtig das es jemand kennt.
    Das ist meine Signatur und sie wird wunderbar sein!
    Hallo in die Runde

    Das Passwörter nicht in den Quelltext gehören wurde ja bereits des öfteren besprochen. Das ALLES auch "hackbar" ist wissen wir auch bereits alle.
    Es wäre aber interessant wenn auch dieser Thread nicht wieder ausartet mit Meinungen was NICHT sicher ist. Interessant wäre mal ein Ansatz (inkl. Erklärung) was und wie es "sicher genug" ist.
    Wäre der Hammer wenn es mal in diese Richtung ginge.

    Grüße
    Sascha
    If _work = worktype.hard Then Me.Drink(Coffee)
    Seht euch auch meine Tutorialreihe <WPF Lernen/> an oder abonniert meinen YouTube Kanal.

    ## Bitte markiere einen Thread als "Erledigt" wenn deine Frage beantwortet wurde. ##

    Das hängt von der Anwendung ab.
    Soll es für eine Online Datenbank sein, dann Login dann über einen Webservice und ggf. einem Auth Verfahren.
    Das ist meine Signatur und sie wird wunderbar sein!

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

    Mono schrieb:

    einen Webservice und ggf. einem Auth Verfahren.

    und die Logindaten hierfür sind WO hinterlegt??
    If _work = worktype.hard Then Me.Drink(Coffee)
    Seht euch auch meine Tutorialreihe <WPF Lernen/> an oder abonniert meinen YouTube Kanal.

    ## Bitte markiere einen Thread als "Erledigt" wenn deine Frage beantwortet wurde. ##

    Naja, es bleibt dabei, wenn der Benutzer sich nicht irgendwie Authentifiziert hast du ein Problem.
    Man kann dann halt nichts mit dem User Passwort oder bei AD mit seiner SID (oder ähnlichem) verschlüsseln.

    Bei WebApis ist mir schon öfters unter die Finger gekommen das man sich einmalig mit Bernutzername/Passwort anmeldet und dafür ein AuthToken erhält (dies ist dann eine Weile gültig und kann verlängert werden so lange man Requests absetzte) oder einen API-Key erhält mit dem man sich ab diesem Zeitpunkt anmelden kann.

    Nachtrag: Bei Anwendungen im Unternehmensumfeld ist ganz klar AD / LDAP Anmeldung von Vorteil
    Die deutsche Sprache ist Freeware, du kannst sie benutzen, ohne dafür zu bezahlen. Sie ist aber nicht Open Source, also darfst du sie nicht verändern, wie es dir gerade passt.
    Dazu meldet man sich zum Beispiel über Auth0 an mit seinem Google Account oder einem komplett neuem.
    Mit dem erhältst dann ein Jwt Token das du mitsenden musst. Geht auch mit dem Windowsaccount.
    Im Zweifel ist das aber nicht mal zwingend erforderlich.
    Wenn es nur um ein paar Daten geht kann man auch anonymen Zugriff erlauben und am Webservice eine DDOS Protection oder ähnliches verwenden.
    Man bietet über den Service dann aber nur explizit die Daten öffentlich an die man rausgeben will und nicht die Datenbank oder weitere Daten.
    Mit Paging usw. kann man auch die Datenmengen im Rahmen halten.
    Das ist meine Signatur und sie wird wunderbar sein!
    Hallo

    Dem TE geht es denke ich um etwas anderes. Mich würde auch irgendwie interessieren wie man ein Kennwort relativ (!!) sicher speichern kann.
    Beispiel. Ich möchte ein Kennwort welches der Benutzer eingibt speichern. Wie und wo speichere ich dieses Lokal ab so das man möglichst schwer rankommt? Ich weis, es kann nicht so gespeichert werden das man NICHT rankommt. Aber gibt es eine möglichkeit das nicht gleich jeder "geek" das Kennwort sieht. Ich denke das meint der TE.

    Ansonsten soll sich der Te mal melden was genau für Ihn relevant wäre.

    Grüße
    Sascha
    If _work = worktype.hard Then Me.Drink(Coffee)
    Seht euch auch meine Tutorialreihe <WPF Lernen/> an oder abonniert meinen YouTube Kanal.

    ## Bitte markiere einen Thread als "Erledigt" wenn deine Frage beantwortet wurde. ##

    Wäre mal interessant zu wissen. Manche Programme wo man z.B. einen Proxy hinterlegt, müssen das ja auch im Klartext/Pseudo-Verschlüsselung Benutzername/Kennwort speichern...
    Könnte man hierfür einen SecureString unter VB/C# verwenden? Der ist ja nur unter dem selben Benutzer auf dem selben PC wieder entschlüsselbar... Das ganze hab ich mal für PowerShell gemacht, um bei geplanten Aufgaben (Skripte) ein Kennwort zu hinterlegen. Hier ist das Risiko meiner Meinung nach eher gering... der Service-benutzer unter dem die Aufgabe ausgeführt wird, ist ja nie angemeldet, somit kommt auch keiner auf die Versuchung das Kennwort zu entschlüsseln.

    Das könnte man für ein normales Programm ja auch umsetzten... Sollte man allerdings Schadsoftware auf dem PC haben und die unter dem Benutzer laufen, so könnte die die Kennworter auch entschlüsseln (allerdings Schadsoftware könnte ja auch ein Keylogger sein).

    Wenn es nur 1 Kennwort ist, würde ich es den Benutzer beim Start der Anwendung eintippen lassen.
    Mehrere Kennwörter kann man ja mit AES verschlüsseln, dann erstellt man mit HMAC aus dem "Masterkennwort" (was der Benutzer eintippt) einen Key...
    NETworkManager - A powerful tool for managing networks and troubleshoot network problems!
    "Security through obscurity" finde ich ist nie ein weg.
    Lass einfach gleich den Obfuscator weg.
    Dieser macht in 99% der Fälle nur Probleme weil irgendwas entweder falsch erkannt wird( Virus ) und oder
    andere Programmteile deshalb versagen. Und sicher ist man mit nem Obfuscator auch nicht weil man es trotztdessen
    immer noch Decompilen kann ist zwar etwas schwieriger aber es geht.

    Mach am besten Open Source wenn es dort Schwachstellen gibt wird man dich darauf hinweisen und es wird viel mehr zuspruch bekommen
    da es halt für jeden einsehbar ist was / wie / wo genau passiert.

    Ansonsten wie hier einige schon schrieben würde ich wenn dann Logins über eine WebAPI bevorzugen mit nem AuthToken
    worüber dann alles weitere gehandhabt wird.
    Grüße , xChRoNiKx

    Nützliche Links:
    Visual Studio Empfohlene Einstellungen | Try-Catch heißes Eisen
    Danke für die viele Meinungen/Feststellungen!

    slice schrieb:

    Passwörter gehören nicht in den Quellcode!

    Klar, hatte die Frage aus Interesse gestellt:

    MaxeStudios schrieb:

    Passwörter [...] in einem Programm zu definieren ist eine sehr einfache Methode für andere diese einfach auszulesen.




    Kann ja nicht jedem Antworten, aber ich bin jetzt schlauer, danke an alle :thumbup: :D



    @Nofear23m das bringt das Thema gut auf den Punkt, danke :)

    ╔══╦═╦╦╦═╦══╦══╦╗╔╦═╦╦═╦══╗
    ║║║║╩╠..╣╦╬╗╚╬╗╔╣╚╝║╠║║║╠╗╚╣
    ╚╩╩╩╩╩╩╩═╩══╝╚╝╚══╩═╩╩═╩══╝

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

    Nofear23m schrieb:

    Hallo

    Dem TE geht es denke ich um etwas anderes. Mich würde auch irgendwie interessieren wie man ein Kennwort relativ (!!) sicher speichern kann.
    Beispiel. Ich möchte ein Kennwort welches der Benutzer eingibt speichern. Wie und wo speichere ich dieses Lokal ab so das man möglichst schwer rankommt? Ich weis, es kann nicht so gespeichert werden das man NICHT rankommt. Aber gibt es eine möglichkeit das nicht gleich jeder "geek" das Kennwort sieht. Ich denke das meint der TE.

    Ansonsten soll sich der Te mal melden was genau für Ihn relevant wäre.

    Grüße
    Sascha


    Am besten mit Rijndal verschlüsselt in eine Datei. Für das Entschlüsseln brauchst du dann aber ein "Passwort" oder ein KeyFile. (Im Grunde wie das Passwortmanager machen)
    Es ginge im Zweifel auch sich das Token von deinem WindowsAccount zu holen und es mit diesem zu verschlüsseln.
    Siehe Google Chrom Passwörter.

    Ansonsten kann man die Passwörter auch anhand irgendeiner ID verschlüsseln (was dann aus dem Quellcode heraus aber ersichtlich wird). Zum Beispiel die Mainboard SerienNr oder ähnliches.
    Man kann die Passwörter auch in eine Datei(bei NTFS zumindest) in einen Alternate Data Streams speichern. Dort findet die auch keiner so schnell, außer er versteht den code ;)
    Das ist meine Signatur und sie wird wunderbar sein!

    Mono schrieb:

    Am besten mit Rijndal verschlüsselt in eine Datei. Für das Entschlüsseln brauchst du dann aber ein "Passwort" oder ein KeyFile.
    Ich habe gelegentlich das Problem, dass der Zugang auf externe Services mit Passwort gesichert ist.
    Die Benutzer kennen das Passwort nicht und sollen es auch nicht unbedingt kennen.

    In dem Fall speichere ich die Zugangsdaten verschlüsselt (zusammen mit anderen Programmparametern) in einer Datenklasse, die in eine XML-Datei serialisiert wird und bei Programmstart per Deserialisierung geladen wird.
    Als Verschlüsselungs-Passwort verwende ich eine Kombination aus dem Namen der Klasse, dem Pfad der XML-Datei und einem dritten Element.

    Als firmeninternen Schutz halte ich es für ausreichend.
    Das ist nicht unknackbar, aber für unsere Benutzer sind die Hürden hoch genug.

    Das ist aber keine Methode, die ich für frei verteilbare Programme verwenden würde!
    --
    If Not Program.isWorking Then Code.Debug Else Code.DoNotTouch
    --