Eingegebene Benutzerdaten für die Laufzeit geschützt ablegen?

  • VB.NET

Es gibt 14 Antworten in diesem Thema. Der letzte Beitrag () ist von KlyX.

    Eingegebene Benutzerdaten für die Laufzeit geschützt ablegen?

    Hallo zusammen,

    wie ist das denn eigentlich: ich übergebe Logindaten (User in Klartext, Passwort als Hash) aus VB an ein PHP-Script (POST-Daten). PHP-seitig wird geprüft, ob die Daten korrekt sind und je nachdem ein entsprechender Return-Wert geliefert.
    Da es sich um eine API handelt und zur Programmlaufzeit immer wieder (zusammen mit den Credentials) darauf zugegriffen werden muss, müssen ja Benutzername und Passwort-Hash in der Programmlaufzeit immer mal wieder verwendet und übertragen werden.

    Macht es denn deshalb Sinn bzw. ist es überhaupt möglich, diese Daten - solange sie nicht genutzt werden - irgendwo "sicher" aufzubewahren? Ich kann sie einfach in globale Variablen legen - aber ist das sinnvoll?
    Oder spielt es sowieso keine Rolle, da ich die Daten ja immer mal wieder nutze und sie somit in den Momenten eh abgegriffen werden könnten?
    Falls es geht - und sinnvoll ist - womit macht man sowas? Hab nichts gefunden für klassisches VB

    Danke und Gruss,
    KyX
    Chris' Weblog - Mein Blog rund um Vieles :D
    Wirklich sicher ist nichts. Du könntest SecureString verwenden, dann bleiben die Daten nur so lange im RAM wie du es bestimmst.
    msdn.microsoft.com/de-de/libra…curestring(v=vs.110).aspx

    Mehr ist wohl nicht drin. Klar kannst du die Daten auch kryptisch in variablen haben, vorm abschicken dann entkrypten, aber wirklich mehr sicherheit bringst nicht.
    Cloud Computer? Nein Danke! Das ist nur ein weiterer Schritt zur totalen Überwachung.
    „Wer die Freiheit aufgibt, um Sicherheit zu gewinnen, wird am Ende beides verlieren.“
    Benjamin Franklin

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

    KlyX schrieb:

    Passwort als Hash
    Ist Hash hier korrekt?
    Das ist nicht in jedem Falle eineindeutig!Sollte da nicht eine Verschlüselung verwendet werden?
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Wie bezeichnest du das?

    VB.NET-Quellcode

    1. ​Dim pwd As String = Password & Salt
    2. Dim hasher As New Security.Cryptography.SHA256Managed()
    3. Dim pwdb As Byte() = System.Text.Encoding.UTF8.GetBytes(pwd)
    4. Dim pwdh As Byte() = hasher.ComputeHash(pwdb)
    5. Return Convert.ToBase64String(pwdh)

    Würde sagen, es ist verschlüsselt oder? ;)
    Chris' Weblog - Mein Blog rund um Vieles :D

    KlyX schrieb:

    verschlüsselt


    Nein ist es nicht, versuch das mal zu entschlüsseln. Ein Hash ist kein Verschlüsselung, da es nur in einer Richtung funktioniert.

    @RodFromGermany

    Warum sollte man ein Passwort verschlüsselt senden anstatt gehashed? Solange man HTTPS nutzt um die Daten ans PHP zu senden ist doch alles OK.
    Cloud Computer? Nein Danke! Das ist nur ein weiterer Schritt zur totalen Überwachung.
    „Wer die Freiheit aufgibt, um Sicherheit zu gewinnen, wird am Ende beides verlieren.“
    Benjamin Franklin
    Warum solltest Du besondere Vorkehrungen treffen, solange sich das Passwort im Memory befindet? Ist doch eh alles nicht mehr sicher seit den neuesten "Enthüllungen". Jedoch würde ich mir Gedanken machen, ob Du überhaupt bereit dazu bist, eine "sicherheitskritische" Anwendung zu entwickeln, bzw. zu betreuen, da Du ja offensichtlich nicht mal den Unterschied zwischen Verschlüsselung und Prüfsummen kennst. Sollte ein Angreifer im System des Nutzers sitzen, hat er bestimmt nicht im Sinn, ein Passwort für eine API abzugreifen. Der Anwender hat dann weitaus ernsthaftere Probleme. Ferner macht es für Man-In-The-Middle-Attacken keinen Unterschied, ob Du das Passwort im Klartext oder gehashed übergibst, solange Du nur prüfst, ob der Hash, bzw. das Passwort korrekt ist. Da aber der Traffic in der Regel ohnehin verschlüsselt ist, langt es, die Prüfsumme des Passwortes zu übergeben, so hat ein Angreifer wenigstens nicht die Möglichkeit, das Passwort des Anwenders zu kennen. Soll ja Menschen geben, die nutzen überall das gleiche PW.
    Die Unendlichkeit ist weit. Vor allem gegen Ende. ?(
    Manche Menschen sind gar nicht dumm. Sie haben nur Pech beim Denken. 8o
    Also ich war ursprünglich der Meinung dass es ein Hash ist. Aber nach der frage von Rod war ich dann verwirrt in Bezug auf die Funktion die ich nutze. ;) Also Hash passt dann. Und ich kenne den Unterschied sehr wohl.

    Übertragung erfoltg natürlich verschlüsselt - Verbindung über http wird vom Server abgelehnt. Bei der Verbindung wird zudem bei der Anfrage vom Server ein Token und ein Session-Cookie generiert. Auch diese beiden Elemente müssen passen. Sonst gibt die Api einen Error 401 aus.
    wie könnte ich es sonst besser machen? Bzw. Was macht Sinn?
    Chris' Weblog - Mein Blog rund um Vieles :D
    Also in der DesktopApp kannst nicht viel machen. Bietest du diese API selbst an? Falls ja könnte mann mal schauen wie du die Daten im PHP validierst.
    Cloud Computer? Nein Danke! Das ist nur ein weiterer Schritt zur totalen Überwachung.
    „Wer die Freiheit aufgibt, um Sicherheit zu gewinnen, wird am Ende beides verlieren.“
    Benjamin Franklin
    Okay, gut zu wissen.
    Die API biete ich selbst an, ja.
    Ich nutze eine einfach REST-API aus diesem Projekt github.com/mevdschee/php-crud-api

    Dieses Add-On nutze ich zur Absicherung/Authentifizierung gegenüber der API: github.com/mevdschee/php-api-auth
    Die Absicherung basiert beim Addon auf in PHP Hard-coded username und passwort. Hier habe ich in die Auth.php noch eine Funktion eingebaut, die mir anhand des Benutzernamens den in der DB gespeicherte Password-Hash ausliest. Statt den hardcoded-Daten werden dann Benutzername und Passwort-Hash abgeglichen.
    Rest ist gleich geblieben.
    Chris' Weblog - Mein Blog rund um Vieles :D
    Also für's erste schauts OK aus. Konnte auffe schnelle nichts kritisches finden.

    KlyX schrieb:

    noch eine Funktion eingebaut, die mir anhand des Benutzernamens den in der DB gespeicherte Password-Hash ausliest.


    Hier kann aber was drin sein. Wenn du magst kannst du den geänderten Code zeigen, dann können wir schauen.
    Cloud Computer? Nein Danke! Das ist nur ein weiterer Schritt zur totalen Überwachung.
    „Wer die Freiheit aufgibt, um Sicherheit zu gewinnen, wird am Ende beides verlieren.“
    Benjamin Franklin
    Gerne doch - mein PHP ist leider nicht sonderlich gut ;)
    Das hier ist die zusätzliche Funktion, mit der ich über die DB den PW-Hash auslese.
    Die Funktion ist in der auth.php der Authentifizierungs-Addons eingebaut, aber außerhalb der großen Klasse in der auth.php.
    In der Auth.php ist sie drin, weil dort die Post-Daten ankommen.

    Für die DB-Abfrage habe ich PDO mit einem prepared statement verwendet.

    PHP-Quellcode

    1. function getpasswordhash()
    2. {
    3. include 'db_connect.php';
    4. $benutzername = $_POST["username"];
    5. $statement=$pdo->prepare("SELECT * FROM users WHERE username= ?");
    6. $statement->execute(array ($benutzername));
    7. while($row = $statement->fetch()) {
    8. $password_hash = $row['password'];
    9. }
    10. return (array ($benutzername, $password_hash));
    11. }

    Ja, ich weiss - das while kann noch weg ;)

    In der API.php rufe ich zusätzlich zu Beginn diese Funktion auf und benutze später die beiden Variablen für Username und <PW-Hash statt dem fest eingetragenen String:

    PHP-Quellcode

    1. require 'auth.php';
    2. //Ruft Benutzername und Passwordhash aus der entsprechenden Funktion der auth.php ab
    3. list ($username,$password_hash) = getpasswordhash();
    4. //Statt hardcoded benutzername und Passwort, werden hier die oben gelesenen Variablen verwendet, um Username und Passwort(hash) zu prüfen.
    5. $auth = new PHP_API_AUTH(array(
    6. 'authenticator'=>function($user,$pass) use ($password_hash, $username) {
    7. if ($user==$username && $pass==$password_hash) $_SESSION['user']=$user;
    8. }
    9. ));
    10. if ($auth->executeCommand()) exit(0);
    11. if (empty($_SESSION['user']) || !$auth->hasValidCsrfToken()) {
    12. header('HTTP/1.0 401 Unauthorized');
    13. exit(0);
    14. }

    Nach dem Code folgt dann die API.
    Das ist soweit alles.

    Wenn ich irgendwie noch was besser absichern kann/soll/muss, nur heraus damit.
    Und ja, ich will mich genau deswegen an eine Anwendung wagen, die einen Login verwendet und auf eine externe MySQL-DB zugreift schreiben. Genau weil ich mich seit Jahren nicht mehr damit befasst habe und mein Wissen nicht mehr State of the Art ist. Nur muss ich sowas selbst ausprobieren - am besten mit Projekt :)
    Die Anwendung soll ein Tool in der Firma ersetzen, welche die Zugangsdaten zur MySQL-DB hart codiert hat...

    Übrigens: das letzte Mal, dass ich mit Passwort-Hashs gearbeitet habe war, als man noch mit MD5 gehasht hat ;)
    Chris' Weblog - Mein Blog rund um Vieles :D
    Es scheint so OK zu sein, werde nach einem 2. Kaffee noch einmal schauen. Was ich persönlich nicht schön finde ist, das du auf SuperGlobals direkt zugreifst, ich nutze bei SuperGlobals immer filter_input, da du Prepared Statements nutzt ist das hier weniger tragisch. Auch finde ich den Mix aus MySQLi und PDO in einem Projekt wenig gut. Bisher also nur kleine "Schönheits"-Sachen zu bemängeln.
    Cloud Computer? Nein Danke! Das ist nur ein weiterer Schritt zur totalen Überwachung.
    „Wer die Freiheit aufgibt, um Sicherheit zu gewinnen, wird am Ende beides verlieren.“
    Benjamin Franklin
    Danke für den Typ mit filter_input. Kannte ich gar nicht :) Wie gesagt, PHP hab ich nicht wirklich drauf ;) Aber filter_input klingt einfach. Kann ich ja noch anpassen.
    Was PDO angeht: ich hab mal gelernt, PDO ist sicher. Aber wie es scheint, ist MySQLi alternativ auch okay. Aber solange es nur ein Schönheitsfehler ist kann ich damit leben :)

    Deine 2. Tasse Kaffee muss übrigens ganz schön gross sein :D
    Chris' Weblog - Mein Blog rund um Vieles :D

    KlyX schrieb:

    Deine 2. Tasse Kaffee muss übrigens ganz schön gross sein


    Au ja, XXL-Format(Anhang). Ich hatte schon einen genaueren Blick darauf geworfen, hatte mich aber ablenken lassen, so kam ich nicht mehr bis zum Ende, hohle ich morgen mit einer kleineren Tasse Kaffee nach, sorry.

    @KlyX konnte nicht mehr finden, scheint gut.
    Bilder
    • Unbenannt.jpg

      1,32 MB, 1.829×1.673, 70 mal angesehen
    Cloud Computer? Nein Danke! Das ist nur ein weiterer Schritt zur totalen Überwachung.
    „Wer die Freiheit aufgibt, um Sicherheit zu gewinnen, wird am Ende beides verlieren.“
    Benjamin Franklin

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