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

  • 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!


  • #2
    Zitat von t.animal
    2. Danach werden alle Felder aneinandergehängt und mit einem Seperator ( getrennt.
    Dann bei Bedarf ein str_pad auf die gewünschte Länge. rijndael-256 hat selbst schon eine Blockgröße von 32 Bytes.
    Zitat von t.animal
    4. Jetzt wird das ganze mithilfe von mcrypt mit Rijndael-256 verschlüsselt wobei als Schlüssel [...] Passworts verwendet wird
    Nicht zu viel rumbasteln. Was bringt es zum Beispiel den md5 Hash als des Passworted als Passwort zu benutzen?

    Kommentar


    • #3
      Hi,

      Seh ich das richtig, dass du anfängst, die Daten auf dem Server nach dem Absenden zu verschlüsseln und sonst noch irgendwie umzustellen? Wenn die Daten auf dem Weg abgefangen werden nützt das nämlich garnichts, und ein schlecht gesicherter Server ist auch nicht schön.

      Daten zu verschlüsseln ist zwar ein sehr einfacher weg, aber auch eher die letzte Lösung und schützt eher vor Lesen der Daten bei Arbeiten an der Datenbank. Du solltest dir erstmal überlegen, ob solch sensible Daten wirklich den Weg übers Internet machen sollten (falls es überhaupt um Internet geht). Muss es sein, dann sollten entsprechende Sicherheitsmaßnahmen getroffen werden, d.h. https, Server sicher konfigurieren und eine Hardwarefirewall sollte auch angeschafft werden. Idealerweise sollte der Datenbankserver auch nur diesen Dienst anbieten und keine weiteren.

      Gruß Thomas

      Kommentar


      • #4
        Zitat von David Beitrag anzeigen
        Dann bei Bedarf ein str_pad auf die gewünschte Länge. rijndael-256 hat selbst schon eine Blockgröße von 32 Bytes.
        Das heißt, ich muss den String auf ein Vielfaches von 32 bringen? Das wundert mich grade, weil ich davon in der Dokumentation nichts gefunden habe.

        Zitat von David Beitrag anzeigen
        Nicht zu viel rumbasteln. Was bringt es zum Beispiel den md5 Hash als des Passworted als Passwort zu benutzen?
        Korrigier mich: Die Verschlüsselung ist stärker, je länger der Schlüssel ist. Da Passwörter von usern häufig kürzer als 32 Zeichen sind, müsste dadurch nicht die Sicherheit steigen?

        EDIT:
        Zitat von [B
        dinamic at gmail dot com][/B]
        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.
        Verdammt.

        Zitat von Thomas
        Wenn die Daten auf dem Weg abgefangen werden nützt das nämlich garnichts, und ein schlecht gesicherter Server ist auch nicht schön.
        Ich weiß, daher berechne ich z.B. md5-hashes von Passwörtern schon vor dem Absenden per javascript und sende diesen.

        Zitat von Thomas
        Daten zu verschlüsseln ist zwar ein sehr einfacher weg, aber auch eher die letzte Lösung und schützt eher vor Lesen der Daten bei Arbeiten an der Datenbank.
        Ich will ja auch nur vor leaks schützen.

        Zitat von Thomas
        Muss es sein, dann sollten entsprechende Sicherheitsmaßnahmen getroffen werden, d.h. https, Server sicher konfigurieren und eine Hardwarefirewall sollte auch angeschafft werden. Idealerweise sollte der Datenbankserver auch nur diesen Dienst anbieten und keine weiteren.
        Grundsätzlich kann ich mir sowas alles nicht leisten. Leider. Jetzt sagst du natürlich, dann biete den Dienst nicht an. Aber ich sage: Es geht hier nicht um Daten, die die Staatssicherheit gefährden. Die Daten werden recht anonym übertragen und nach der Übertragung verschlüsselt. Ein Man-in-the-middle-Angriff lohnt sich bei Schulnoten mMn eher nicht .

        Kommentar


        • #5
          Hi,

          Wenn keine Zuordnung zu Schülern gemacht werden kann, dann würde ich mir das ganze Verschlüsseln sparen, ansonsten lohnt sich ein MITM Angriff vielleicht nicht wegen dem Wert der Daten, aber jemand kann dir damit Schaden, denn du bist für die Sicherheit der Daten verantwortlich.

          Wird das sowas wie ein Online-Klassenbuch?

          Gruß Thomas

          Kommentar


          • #6
            Ich hab mir mit Excel so ne Tabelle gemacht, die mir sagt, wie viele Punkte ich hab, was ich einbringen sollte etc. Damit bin ich bald an die Grenzen der nativen Excelfunktionen gestoßen und wollte das halt in php machen. Klar werden die Daten nicht mit Namen sondern höchstens Loginnames verknüpft und ich könnte mir die Verschlüsselung sparen.
            Ich mach mir das eher als so ne Art... mhm... Übung - und weil ein ähnlicher Service im Internet bisher scheinbar nicht existiert. Außerdem lässt sich je nachdem wie groß der Nutzerkreis ist auch anhand der Fächerbelegung Rückschlüsse auf den Nutzer ziehen.

            Kommentar


            • #7
              Das klingt, als wenn die Schüler ihre eigenen Noten (selbstbestimmt) eintragen.

              Kommentar


              • #8
                Hi,

                Ja so klingt es, dachte jetzt eher da würde eine Lehrkraft Noten eintragen.

                Gruß Thomas

                Kommentar


                • #9
                  @David: Jap. Stell dir vor, jeder Schüler hat einen Notenbogen, auf dem er eben seine Leistungen immer im Überblick hat. Grundsätzlich will ich so etwas machen. Später eventuell, wenn mich die Muse packt, füge ich noch Warnungen hinzu, wenn Gefahr besteht, nicht zum Abi zugelassen zu werden etc.

                  Aber was ist denn jetzt mit diesen ominösen 32? Ich hab grad mal 25 Ziffern erfolgreich ver- und entschlüsselt, ohne da was gedreht zu haben?!

                  Kommentar


                  • #10
                    Ich wollte nur darauf hinweisen, dass ein Padding unterhalb der Blockgröße nichts bringt. Wenn Du zum Beispiel immer auf 25 Zeichen auffüllst, nutzt das nichts, weil mcrypt/der Blockcipher das eh auf 32 Zeichen auffüllen.

                    Kommentar


                    • #11
                      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.)

                      Kommentar


                      • #12
                        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".

                        Kommentar


                        • #13
                          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.

                          Kommentar


                          • #14
                            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.

                            Kommentar


                            • #15
                              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 )

                              Kommentar

                              Lädt...
                              X