PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Dateien unter kryptischen Links verfügbar machen


mittelding
2011-09-18, 18:19:02
Hallo!

Mein Problem ist eigentlich nicht wirklich schwierig, habe jetzt schon einige Ideen zur Lösung, suche aber den saubersten Weg. Es geht darum, ähnlich wie bei Link-Shortener-Diensten wie bit.ly und goo.gl, Dateien unter kryptischen, generierten Links verfügbar zu machen. Die Dateien liegen dabei physikalsich außerhalb des web-roots und sollen eben nur auf diese eine Weise erreichbar sein.

Hier mal kurz die Anforderungen:

1. Die Links müssen nicht zwingend kurz sein, ist nur ein nice-to-have
2. Man soll nicht indirekte Rückschlüsse auf Dateinamen o.ä. machen können - der Link der Datei "Datei_1" sollte komplett anders aussehen als der Link der fast gleichnamigen "Datei_2".
3. Dementsprechend soll man an der URL auch nicht erkennen können, welches die nächste Datei ist, die intern verwaltet wird. Die URL-Namen sollten also schön über das ganze Band an Möglichkeiten verteilt sein.


Ich denke es wäre am besten, wenn die URL garnicht erst aus dem Dateinamen als Parameter erzeugt wird. Eventuell gibt es eine Möglichkeit, eine völlig isolierte und unabhängige URL-Erzeugungsmethode zu verwenden, welche am Dateinamen garnicht interessiert ist.

Jetzt suche ich natürlich die eleganteste Methode, dies zu realisieren. Dachte erst daran, die aktuelle Microtime durch eine fertige Hashfunction zu jagen und fertig. Allerdings wären wir dann sicherlich bei 20-30 Stellen, wie gesagt, eine URL mit 5-6 Stellen wäre nice-to-have.

Jetzt aber zur für mich interessantesten Frage: die URL wird ja praktisch Primärschlüssel in der Datenbank, oder zumindest Schlüsselkandidat. Finde es sehr unschön, erst in der DB nachzuschauen zu müssen, ob mein generierter Wert nicht schon vorhanden ist, dann im Programmfluss einen anderen Wert generieren zu müssen, dann wieder zu schauen ob dieser vorhanden ist usw.. eventuell kann mir die Datenbank da Arbeit abnehmen und den Wert selbst erzeugen? Habe mysql und postgresql zur Verfügung.


Danke!

Gast_samm
2011-09-19, 09:21:18
Postgres eingebaute hash-Funktionen: http://www.postgresql.org/docs/8.3/static/pgcrypto.html

Eigentlich einfacher: Benutz einfach einen Autoincrement-Int-Wert, den du auch als Key in der DB benutzen kannst, und encodiere den entsprechend, dass du mehr Info pro Zeichen zur Verfügung hast als 10 Werte. Base64 z.B.

Trap
2011-09-19, 10:24:02
Ein kryptographischer Hash des Inhalts wär auch möglich. Damit hat man Deduplikation sofort mit dabei, zu echten Kollisionen müsste man sich aber eventuell auch was überlegen.

DanMan
2011-09-19, 19:22:52
CRC32 hat 8 Stellen und ist ziemlich fix berechnet. Wenn du einen Hash eines Timestamps erstellst sollte es keine Kollisionen geben. Allerdings könntest du den dann auch direkt speichern, denn der hat auch nicht viel mehr stellen.

mittelding
2011-09-20, 22:23:59
Vielen Dank für eure Vorschläge. Habe mir jetzt selbst was gebastelt, was Uhrzeit/Zufallsgenerator zu Hilfe nimmt und lediglich 4 Stellen erzeugt. Hätte es gleich so gemacht wenn ich davor mal ausgerechnet hätte, wie viele Kombinationen man mit lediglich 4 Stellen (A-Za-z0-9) erzeugen kann. :freak:

Darkstar
2011-09-20, 23:10:51
Jetzt aber zur für mich interessantesten Frage: die URL wird ja praktisch Primärschlüssel in der Datenbank, oder zumindest Schlüsselkandidat. Finde es sehr unschön, erst in der DB nachzuschauen zu müssen, ob mein generierter Wert nicht schon vorhanden ist, dann im Programmfluss einen anderen Wert generieren zu müssen, dann wieder zu schauen ob dieser vorhanden ist usw.. eventuell kann mir die Datenbank da Arbeit abnehmen und den Wert selbst erzeugen? Habe mysql und postgresql zur Verfügung.Für genau sowas wurden UUID (http://de.wikipedia.org/wiki/Universally_Unique_Identifier)s „erfunden“. MySQL liefert eine Funktion (http://dev.mysql.com/doc/refman/5.5/en/miscellaneous-functions.html#function_uuid) zum Erzeugen mit, bei PostgreSQL benötigt man wohl ein zusätzliches Modul (http://www.postgresql.org/docs/current/static/uuid-ossp.html). Allerdings sind die UUIDs etwas länger als bei 1. gewünscht.