Christian Bliß: Verschlüsselung

Hallo,

folgendes Problem (in aller Kürze):

  • mySQL-Datenbank
  • auto-inkrement für den Primärschlüssel
  • die einzelnen Datensätze sollen per E-Mail-Link abgerufen werden können
  • ich will nicht, dass jeder gleich erkennt, dass es sich um eine ID-Nummer handelt, die immer 1 hochzählt
  • deshalb will ich den Primärschlüssel mit PERL/CGI verschlüsseln
  • beim Abrufen des Datensatzes wird der "Code" dann wieder in den Primärschlüssel umgeschlüsselt

Fragen:

  • Klappt das ohne weiteres?
  • Brauche ich dazu eine neue Spalte in der Datenbank, wo der "Code" gespeichert werden muss?
  • Wie sicher ist die Veschlüsselung?

Danke!
Gruß Christian

  1. Hallo Christian!

    base64_encode()
    hexdec()
    bin2hex()

    kämen für dich vielleicht in Frage!?

    Grüße, Matze

  2. Moin!

    • die einzelnen Datensätze sollen per E-Mail-Link abgerufen werden können
    • ich will nicht, dass jeder gleich erkennt, dass es sich um eine ID-Nummer handelt, die immer 1 hochzählt
    • deshalb will ich den Primärschlüssel mit PERL/CGI verschlüsseln
    • beim Abrufen des Datensatzes wird der "Code" dann wieder in den Primärschlüssel umgeschlüsselt

    Ungünstig.

    Generiere z.B. einen zufälligen, ausreichend langen Abrufcode für den Datensatz. Damit keine Zweideutigkeiten auftreten können, sollte auf dieser neu anzulegenden Spalte ein UNIQUE-Index liegen - ist auch für den Zugriff sinnvoll.

    • Klappt das ohne weiteres?

    Wer rauskriegt, was du tust, um die Datensatznummer zu verschleiern, kann problemlos dasselbe tun, um andere Datensätze abzurufen.

    • Brauche ich dazu eine neue Spalte in der Datenbank, wo der "Code" gespeichert werden muss?

    Das erscheint mir sinnvoll.

    • Wie sicher ist die Veschlüsselung?

    Hängt davon ab, welche du verwendest.

    Die von Matze genannten Funktionen sind allesamt KEINE Verschlüsselung.

    - Sven Rautenberg

    --
    My sssignature, my preciousssss!
    1. Hallo,

      Generiere z.B. einen zufälligen, ausreichend langen Abrufcode für den Datensatz. Damit keine Zweideutigkeiten auftreten können, sollte auf dieser neu anzulegenden Spalte ein UNIQUE-Index liegen - ist auch für den Zugriff sinnvoll.

      Wie kann ich am besten in PERL/CGI so eine Abrufcode generieren? Mit rand() bekomme ich ja nur einen zufälligen Zahlencode. Gerne hätte ich auch Buchstaben (ggf. auch mit zufälliger Groß/Kleinschreibung) oder so etwas drin.
      Tipps?

      Gruß Christian

      1. Hi Christian,

        Wie kann ich am besten in PERL/CGI so eine Abrufcode generieren? Mit rand() bekomme ich ja nur einen zufälligen Zahlencode. Gerne hätte ich auch Buchstaben (ggf. auch mit zufälliger Groß/Kleinschreibung) oder so etwas drin.

        Klaus hat dir da ja schon einen Tip gegeben - ich habe die Doku gerade mal kurz überflogen, wie es aussieht ist das genau das, was du suchst.

        MfG, Dennis.

        --
        Mein SelfCode: ie:{ fl:( br:> va:) ls:[ fo:) rl:( n4:# ss:) de:] js:| ch:{ sh:| mo:} zu:|
        Patch zur Verwendung von PATHINFO in JLog
        Man kann die Menschen zur Vernunft bringen, indem man sie dazu verleitet, daß sie selbst denken. (Voltaire)
        1. Hallo,

          Klaus hat dir da ja schon einen Tip gegeben - ich habe die Doku gerade mal kurz überflogen, wie es aussieht ist das genau das, was du suchst.

          Tatsache ... hab ich ganz überlesen ;)
          Danke, ich werd es mal ausbrobieren.

          Gruß Christian

  3. Hallo,

    Der Primärschlüssel muss ja nicht zwangsläufig eine fortlaufende Nummer sein.
    Warum verwendest Du nicht ein Modul  String::Random um eine nicht-sequenzielle ID für den Datensatz zu generieren.

    Grüße
      Klaus

    1. 你好 Klaus,

      Warum verwendest Du nicht ein Modul  String::Random um eine nicht-sequenzielle ID für den Datensatz zu generieren.

      Naja, das Modul stellt aber nicht sicher, dass die ID eindeutig ist, das kann zu Problemen führen (man muss uU mehrfach IDs generieren, bis man eine freie gefunden hat, es mag, je nach Anwendungsfall, sogar Race Conditions geben). Ich würde da eher sowas wie UUID/GUID benutzen.

      再见,
       克里斯蒂安

      --
      Das Malheur mit dem Open Source | Frühling
      73.255437% der Statistiken spielen eine Genauigkeit vor, die durch die angewandte Methode nicht gerechtfertigt wird.
      http://wwwtech.de/
      1. Hi Christian,

        Ich würde da eher sowas wie UUID/GUID benutzen.

        Ich verstehe nicht ganz, wie das funktioniert - dieses Modul muss sich doch auch irgendwie „merken”, welche IDs es schon vergeben hat und welche nicht, oder? Ich sehe aber nirgendwo etwas, wo da solche Informationen in eine Datei o.ä. abgespeichert werden…

        再见,
        克里斯蒂安

        Was muss ich mir eigentlich (WinXP SP2) installieren, damit ich wieder die „richtigen” Zeichen angezeigt bekomme?

        MfG, Dennis.

        --
        Mein SelfCode: ie:{ fl:( br:> va:) ls:[ fo:) rl:( n4:# ss:) de:] js:| ch:{ sh:| mo:} zu:|
        Patch zur Verwendung von PATHINFO in JLog
        Viele Menschen sind gut erzogen, um nicht mit vollem Mund zu sprechen, aber sie haben keine Bedenken, es mit leerem Kopf zu tun. (Orson Welles)
        1. Hallo Dennis.

          再见,
          克里斯蒂安

          Was muss ich mir eigentlich (WinXP SP2) installieren, damit ich wieder die „richtigen” Zeichen angezeigt bekomme?

          Du könntest eine passende Unicode-fähige Schriftart installieren.

          Einen schönen Sonntag noch.

          Gruß, Ashura

          --
          sh:( fo:} ch:? rl:( br: n4:~ ie:{ mo:| va:) de:> zu:} fl:( ss:) ls:[ js:|
          „It is required that HTML be a common language between all platforms. This implies no device-specific markup, or anything which requires control over fonts or colors, for example. This is in keeping with the SGML ideal.“
          [HTML Design Constraints: Logical Markup]
          1. Hi Ashura,

            Du könntest eine passende Unicode-fähige Schriftart installieren.

            Das hats nicht gebracht - aber was auf der verlinkten Seite stand von wegen in den "Regios- und Sprachoptionen" die Unterstützung für ostasiatische Sprachen auszuwählen, das hat zum Erfolg geführt :-)

            MfG, Dennis.

            --
            Mein SelfCode: ie:{ fl:( br:> va:) ls:[ fo:) rl:( n4:# ss:) de:] js:| ch:{ sh:| mo:} zu:|
            Patch zur Verwendung von PATHINFO in JLog
            Jeder kann wütend werden, das ist einfach. Aber wütend auf den Richtigen zu sein, im richtigen Maß, zur richtigen Zeit, zum richtigen Zweck und auf die richtige Art, das ist schwer. (Aristoteles)
        2. 你好 Dennis,

          Ich würde da eher sowas wie UUID/GUID benutzen.

          Ich verstehe nicht ganz, wie das funktioniert - dieses Modul muss sich doch auch irgendwie „merken”, welche IDs es schon vergeben hat und welche nicht, oder? Ich sehe aber nirgendwo etwas, wo da solche Informationen in eine Datei o.ä. abgespeichert werden…

          Ein Teil der UUID ist ein Zeitstempel, ein Teil der UUID ist Host- oder sogar Programm-abhängig (hängt von der Verwendung ab). Ein weiterer Teil ist zufällig. Die Wahrscheinlichkeit, dass eine doppelte ID generiert wird, ist dadurch sehr, sehr gering (AFAIR geht sie gegen 0).

          再见,
           克里斯蒂安

          --
          Das Malheur mit dem Open Source | Frühling
          Mensch zu Mathematiker: "Ich finde Ihre Arbeit ziemlich monoton". Mathematiker: "Mag sein! Dafür ist sie aber stetig und unbeschränkt."
          http://wwwtech.de/
          1. Hi Christian,

            Ein Teil der UUID ist ein Zeitstempel, ein Teil der UUID ist Host- oder sogar Programm-abhängig (hängt von der Verwendung ab). Ein weiterer Teil ist zufällig.

            Ah, ok - die Uhrzeit machts ;-) Allein bei einem Timestamp mit Microsekunden ist deine Doppelung ja schon eher unwahrscheinlich, wenn da noch weitere Faktoren hinzukommen… Ich muss ich mal auf die Suche machen, ob es so ein Modul auch für PHP gibt…

            MfG, Dennis.

            --
            Mein SelfCode: ie:{ fl:( br:> va:) ls:[ fo:) rl:( n4:# ss:) de:] js:| ch:{ sh:| mo:} zu:|
            Patch zur Verwendung von PATHINFO in JLog
            Berater sind Leute die dir deine Uhr wegnehmen, damit sie dir anschließend sagen können wie spät das es ist! (Aus einem Kabarett)
            1. Moin!

              Ich muss ich mal auf die Suche machen, ob es so ein Modul auch für PHP gibt…

              http://de2.php.net/uniqid

              - Sven Rautenberg

              --
              My sssignature, my preciousssss!
      2. Hallo,

        Naja, das Modul stellt aber nicht sicher, dass die ID eindeutig ist[...]. Ich würde da eher sowas wie UUID/GUID benutzen.

        Ursprünglich wollte ich diese beiden Module auch mit vorschalgen, aber die UUID bzw. GUID sind ja doch noch etwas berechenbarer als ein Zufalls-String.
        Und bezüglich von doppelten Ergebnissen mit String::Random kann ich nur aus meiner Erfahrung damit berichten. Ich habe es nämlich mal dazu eingesetz, so etwas wie Serien-Nummern zu generieren. Da ich auch ähnliche Befürchtungen wie Du hattest, habe ich testhalber eine für mich hinreichende Menge (so ca. 5 Millionen) Werte generieren lassen und zwar sowohl innerhalb eines Script-Aufrufes als auch zeitlich versetzte und auf verschiedenen Rechnern verteilt. Kein einzige Verdoppelung wurde registriert bei 30 signifikaten Zeichen. Und weil es beim betreffenden Projekt lediglich um ca 100.000 Werte ging, die im Laufe der Zeit erstellt werden sollten, war mir das sicher genug, zumal ich natürlich auf im Produktivsystem eine Überprüfung auf Eindeutigkeit verwendet habe.

        Grüße
          Klaus