Ankündigung

Einklappen
Keine Ankündigung bisher.

Sicheres verschlüsseln mit mcrypt?

Einklappen

Neue Werbung 2019

Einklappen
X
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • t.animal
    hat ein Thema erstellt Sicheres verschlüsseln mit mcrypt?.

    Sicheres verschlüsseln mit mcrypt?

    Hi!

    Ich möchte diverse Schulnoten in einer DB speichern. Ich habe mir folgendes Konzept überlegt und wollte euch mal fragen, was ihr davon haltet - bitte korrigiert mich, wenn ich in meinen Überlegungen einen Fehler habe:

    1. Nachdem die Schulnoten übermittelt wurden, werden erstmal die nicht übermittelten Felder (wenn z.B. Englisch keine Note eingetragen wurde) mit zufälligen Buchstaben aufgefüllt.

    2. Danach werden alle Felder aneinandergehängt und mit einem Seperator ( getrennt.

    3. Anschließend wird an den Mischmasch der md5-hash des Userpassworts angehängt und die Daten an einer zufälligen Stelle abgeschnitten und hinten wieder angehängt (bspw: "Englisch_1-1:15;Englisch_1-2:12;Englisch_1-3:srha;*md5-hash*" =>sch_1-2:12;Englisch_1-3:srha;*md5-hash*Englisch_1-1:15;Engli)

    4. Jetzt wird das ganze mithilfe von mcrypt mit Rijndael-256 verschlüsselt wobei als Schlüssel wieder der md5-hash des Passworts verwendet wird und das Ergebnist in einem TEXT-Feld einer mysql-DB abgelegt.


    Zur Erläuterung der einzelnen Schritte (ich kenne mich nicht 100% gut mit Verschlüsselungstechnik aus und habe daher vielleicht ein paar Denkfehler drin - weist mich bitte drauf hin):

    1. Um schon den Ausgangsblock zu "verzufälligen" füge ich hier die Buchstaben ein.

    2. Damit hoffe ich die Performance zu erhöhen, da ich davon ausgehe, dass das entschlüsseln von 30 Noten langsamer ist, als das entschlüsseln von 1 größeren Block.

    3. Damit der Block nicht mit einem vorhersehbaren Wert beginnt verschiebe ich alles und verwende einen eindeutigen Wert (md5-hash) als Trennzeichen. Gleichzeitig kann ich später nach dem Entschlüsseln einfach herausfinden ob das Passwort richtig war, indem ich gucke ob der Hash im Klartext enthalten ist.

    4. Jetzt verschlüssele ich das ganze mit AES-256.


    Vielen Dank schonmal!

  • David
    antwortet
    • Wenn bekannt ist, dass Du das Passwort erst durch einen Hashalgorithmus schickst, nutzt Dir das nichts. Der `Angreifer´ kann das ja auch.
    • PHP: mcrypt_generic_init - Manual
      The maximum length of the key should be the one obtained by calling mcrypt_enc_get_key_size() and every value smaller than this is legal.

    Einen Kommentar schreiben:


  • t.animal
    antwortet
    Zitat von David Beitrag anzeigen
    Ja und nein. Ja, wenn Du nur den hash speicherst und Dein System irgendwo ein Leck hat (zum Beispiel sql inject vulnerability) wird `nur´ der Hash des Passwortes bekannt. Bei einem hinreichend sicheren Hashalgorithmus ist das Passwort nicht sofort kompromittiert. Nein, es macht aus einem `dummen´ Passwort keine sichere Sache. Wenn der Benutzer bei Deinem "mindestens sechs Zeichen"-Passwortsystem aaaaaa oder 123456 wählt, wird daraus durch hash('sha512', $userinput, true) kein besseres Passwort.
    Warum nicht? Geht es dir nur um brute force-Angelegenheiten? Angenommen die verschlüsselten Daten lecken ins Netz. Wäre es dann nicht schwerer, den Text der mit "æÈ;(*ë.(DYW!Ì�»ÚGË$S|yù»„ð@9ágnk¨W>X¡%㪠2©åXy®"°ÂÖ!6ü >…ø»" verschlüsselt wurde zu entschlüsseln, als einen der als Key nur "password" verwendet hat?

    EDIT: Ah... ich glaube ich verstehe. Die Sicherheit erhöht sich dadurch *nicht*, richtig? Weil ja der User rein theoretisch auch alle Sonderzeichen etc verwenden kann?!

    EDIT2: AES-256 erfordert einen 32-Zeichen schlüssel, richtig? Um diesen zu generieren bietet sich doch aber diese hash-geschichte an!? Ich kann ja von niemandem verlangen, sich 32 Zeichen zu merken.

    Zitat von David Beitrag anzeigen
    Salt muss erkennbar und im Klartext mit gespeichert werden, sonst kannst Du keinen vergleichbaren Hash aus der Klartexteingabe erstellen. Es dient nur gegen Rainbow-Tables und der Verschleierung gleicher Passwörter verschiedener Benutzer.
    Ah. Verstehe endlich...

    Einen Kommentar schreiben:


  • David
    antwortet
    Zitat von t.animal Beitrag anzeigen
    Gut. Wenn wir evtl. Fehler im Hash-Algorithmus mal außer acht lassen, würde die Sicherheit des verschlüsselten Parts durch folgende Aktion steigen (abgesehen natürlich von Brute-Force, s.u.)?
    PHP-Code:
    $keyhash('sha512''Password'true);
    //$Key = æÈ;(*ë.(DYW!Ì�»ÚGË$S|yù»„ð@9ágnk¨W>X¡%㪠2©åXy®"°ÂÖ!6ü >…ø» 
    Ja und nein. Ja, wenn Du nur den hash speicherst und Dein System irgendwo ein Leck hat (zum Beispiel sql inject vulnerability) wird `nur´ der Hash des Passwortes bekannt. Bei einem hinreichend sicheren Hashalgorithmus ist das Passwort nicht sofort kompromittiert. Nein, es macht aus einem `dummen´ Passwort keine sichere Sache. Wenn der Benutzer bei Deinem "mindestens sechs Zeichen"-Passwortsystem aaaaaa oder 123456 wählt, wird daraus durch hash('sha512', $userinput, true) kein besseres Passwort.

    Salt muss erkennbar und im Klartext mit gespeichert werden, sonst kannst Du keinen vergleichbaren Hash aus der Klartexteingabe erstellen. Es dient nur gegen Rainbow-Tables und der Verschleierung gleicher Passwörter verschiedener Benutzer.

    Einen Kommentar schreiben:


  • t.animal
    antwortet
    Zitat von pacey Beitrag anzeigen
    Bitte bitte bitte keine Hashing oder Kennwortalgorithmen mischen. Anstelle der (erwarteten) höheren Sicherheit erhöht sich die Gefahr durch Schwachstellen zweier eingesetzter Mathematischer Algorithmen enorm.
    Gut. Wenn wir evtl. Fehler im Hash-Algorithmus mal außer acht lassen, würde die Sicherheit des verschlüsselten Parts durch folgende Aktion steigen (abgesehen natürlich von Brute-Force, s.u.)?
    PHP-Code:
    $keyhash('sha512''Password'true);
    //$Key = æÈ;(*ë.(DYW!Ì�»ÚGË$S|yù»„ð@9ágnk¨W>X¡%㪠2©åXy®"°ÂÖ!6ü >…ø» 
    Zitat von Thomas Beitrag anzeigen
    Hi,

    Was soll das bringen? User gibt als Passwort abc an und du verlängerst es nun auf abcabc. Jetzt gibt nun der Hacker das Passwort abc ein und ist drin, da es auch auf abcabc verlängert wird. Willst du aber dem User das veränderte Passwort mitteilen, damit er das längere benutzen muss, dann kannst du ihm auch gleich sagen, er soll ein vernünftiges Passwort erstellen oder ein zufälliges sichereres Passwort erstellen.

    Gruß Thomas
    Ich dachte daran, dem User nicht mitzuteilen,dass sein Passwort verlängert wird. Verwendet er abc rechne ich intern mit abcabc. verwendet er abcdefg verwende ich eben abcdefg. Verwendet er mehr als 32 Zeichen (ÜPHP: mcrypt_enc_get_supported_key_sizes - Manual), dann muss ich eben beschneiden.

    Zitat von Hu5eL Beitrag anzeigen
    könnest du ein sicheres password zu erstellen immer ein salt (nennt man so?) hinten dranhänhen, also zb: password+"$s344j3§" ... dann sieht schonmal backups von der db "knacksicherer"...
    die einfachste methode wäre dich das pw 2 x per MD5() zu "verschlüsseln"...
    Das ist imho nicht richtig. S.: PHP: mcrypt_module_open - Manual

    Zum Thema Salt: Salts bringen's doch nur dann, wenn ich sie nicht gemeinsam mit dem Nutzernamen speichere, oder? Und wie soll ich das bewerkstelligen?

    PS: Verdammt, wie machen die Jungs von TrueCrypt das denn?

    Einen Kommentar schreiben:


  • David
    antwortet
    Zitat von Hu5eL Beitrag anzeigen
    die einfachste methode wäre dich das pw 2 x per MD5() zu "verschlüsseln"...
    Wie ist das gemeint?

    Einen Kommentar schreiben:


  • Hu5eL
    antwortet
    könnest du ein sicheres password zu erstellen immer ein salt (nennt man so?) hinten dranhänhen, also zb: password+"$s344j3§" ... dann sieht schonmal backups von der db "knacksicherer"...
    die einfachste methode wäre dich das pw 2 x per MD5() zu "verschlüsseln"...

    Einen Kommentar schreiben:


  • Thomas
    antwortet
    Zitat von t.animal Beitrag anzeigen
    Ja. Das leuchtet mir ein. Soll ich dann Passwörter die zu kurz sind also besser durch Wiederholung auf die richtige länge bringen?
    Hi,

    Was soll das bringen? User gibt als Passwort abc an und du verlängerst es nun auf abcabc. Jetzt gibt nun der Hacker das Passwort abc ein und ist drin, da es auch auf abcabc verlängert wird. Willst du aber dem User das veränderte Passwort mitteilen, damit er das längere benutzen muss, dann kannst du ihm auch gleich sagen, er soll ein vernünftiges Passwort erstellen oder ein zufälliges sichereres Passwort erstellen.

    Gruß Thomas

    Einen Kommentar schreiben:


  • pacey
    antwortet
    Bitte bitte bitte keine Hashing oder Kennwortalgorithmen mischen. Anstelle der (erwarteten) höheren Sicherheit erhöht sich die Gefahr durch Schwachstellen zweier eingesetzter Mathematischer Algorithmen enorm.

    Beim Hashen werden die Kennwörter ja nicht verschlüsselt sondern es werden Prüfsummen gebildet. Je mehr Schwachstellen das ganze jetzt hat (und seien es nur die von MD5 und SHA1 zusammen) desto mehr Angriffsmöglichkeiten für Kollisionen gibt es später auch.

    Das ist definitiv nicht sicherer sondern eher im wesentlichen unsicherer.

    Einen Kommentar schreiben:


  • David
    antwortet
    Zitat von t.animal Beitrag anzeigen
    Ja. Das leuchtet mir ein. Soll ich dann Passwörter die zu kurz sind also besser durch Wiederholung auf die richtige länge bringen?
    "Passwort abgelehnt. Ihr Passwort ist verdammt noch mal zu kurz, zu billig und zu doof. Geben Sie sofort ein besseres Passwort an. Anderenfalls löscht sich diese Software in 2 Minuten von selbst. Hinweise zu sicheren Passwörtern finden sie hier: <link>.
    Klicken Sie hier: <link>, um ein zufälliges, sicheres Passwort erstellen zu lassen".

    Einen Kommentar schreiben:


  • t.animal
    antwortet
    Ja. Das leuchtet mir ein. Soll ich dann Passwörter die zu kurz sind also besser durch Wiederholung auf die richtige länge bringen?

    PS: Trotzdem bin ich der Meinung, dass auf php.net der md5-hash als key verwendet wird:
    PHP-Code:
    <?php
        
    /* Open the cipher */
        
    $td mcrypt_module_open('rijndael-256''''ofb''');

        
    /* Create the IV and determine the keysize length, use MCRYPT_RAND
         * on Windows instead */
        
    $iv mcrypt_create_iv(mcrypt_enc_get_iv_size($td), MCRYPT_DEV_RANDOM);
        
    $ks mcrypt_enc_get_key_size($td);

        
    /* Create key */
        
    $key substr(md5('very secret key'), 0$ks);

        
    /* Intialize encryption */
        
    mcrypt_generic_init($td$key$iv);
    ( PHP: mcrypt_module_open - Manual )

    Einen Kommentar schreiben:


  • David
    antwortet
    Sie speichern den Hashwert und vergleichen den Hashwert. Aber sie benutzen ihn nicht als Schlüssel für einen Cipher wie AES.
    Ein 3 stelliges, enfaches Passwort bleibt auch wenn es erst durch SHA256 geleitet wird, ein einfaches und kurzes Passwort. Die "Knackversuche" würden nämlich auch durch SHA25 geleitet werden.
    Versuch es nicht (vergeblich) nachträglich zu retten, sondern stell besser sicher, dass keine schwachen Passwörter verwendet werden.

    Einen Kommentar schreiben:


  • t.animal
    antwortet
    Den md5-hash verwende ich, um beim Einloggen des Users das Passwort zu prüfen.
    Wie meinst du miteinander reagieren? Ich verwende den Hash, weil er nach allem was ich gelesen habe mehr Sicherheit bietet: Mehr unterschiedliche Zeichen, meist länger etc. Habe ich mich da vertan? Alle Scripte, die ich gefunden habe, selbst das Beispiel auf php.net generieren den Key aus dem Passwort mit einem Hashwert.

    Einen Kommentar schreiben:


  • David
    antwortet
    Was bringt Dir der Hashwert? Dadurch wird keine zusätzliche Information "erschaffen". Ausserdem weißt Du nicht, ob und wie SHA und AES miteinander "reagieren".

    Einen Kommentar schreiben:


  • t.animal
    antwortet
    Sorry, dass ich nochmal nerve: Wenn ich das Passwort des Nutzers als md5-Hash speichere, und zur Verschlüsselung folgenden Key generiere: hash('sha256', 'passwort', true) (=bspw: £lpÌD™=å8Z×JÛ-®jšÇg%w€0„cM) sollte dadurch nicht 1. die sicherheit des passworts gewahrt bleiben und 2. die verschlüsselung auch mit 256bit erfolgen? (als reaktion auf: dinamic at gmail dot com
    13-Nov-2007 12:05 Also it should be pointed that md5() and/or sha1() should not be used while forming your key for the mcrypt. This is so because hex encoding uses a set of only 16 characters [0-9a-f], which is equivalent to 4 bits, and thus halve the strength of your encryption: 4 x 32 = 128-bit.)

    Einen Kommentar schreiben:

Lädt...
X