2010-12-13 3 views
0

J'ai une application de téléchargement et je veux crypter les liens pour les téléchargements de fichiers, de sorte que l'utilisateur ne connaisse pas l'ID du fichier. En outre, je voudrais inclure la date et l'heure dans le lien, et vérifier lors de la diffusion du fichier si le lien est toujours valide.Cryptage de lien avec django et python

Il y a une question similaire posée here, mais je rencontre des problèmes avec les encodages de caractères, puisque j'aimerais avoir des URLs comme /file/encrypted_string/ pointant vers les vues à télécharger, donc mieux si le résultat chiffré contient seulement lettres et chiffres. Je préfère ne pas utiliser un hachage, parce que je ne veux pas stocker un fichier de hachage de mappage <> quelque part. Je ne sais pas s'il y a un bon cryptage qui répond à mes besoins ...

Répondre

2

On dirait que ce serait facile, surtout si cela ne vous dérange pas d'utiliser la même clé de cryptage pour toujours. Juste délimiter une chaîne (/ ou: fonctionne aussi bien que n'importe quoi) pour le nom du fichier, la date/heure, et tout ce que vous voulez inclure, puis crypter et b64 il! N'oubliez pas d'utiliser urlsafe_b64encode, pas le b64encode normal, qui produira des URL brisées. Ce sera une longue ficelle, mais alors? Je l'ai fait quelques fois, en utilisant une légère variation: Ajouter quelques caractères aléatoires comme le dernier morceau de la clé et l'inclure au début ou à la fin de la chaîne - plus sûr que de toujours réutiliser la même clé , sans les maux de tête d'un mappage de base de données. Tant que votre clé est suffisamment complexe, les bits exposés ne seront pas suffisants pour permettre aux crackers de générer des requêtes à volonté.

Bien sûr, si le fichier n'existe pas, ne les laissez pas voir le résultat ...

+0

Pefect, ne pense pas à base64 avant. Je me suis amusé à jouer pour savoir comment convertir la chaîne avant de la décoder d'unicode en chaîne, mais c'était exactement la solution que je cherchais! –

1

La manière la plus simple de gérer cela est de générer une chaîne aléatoire pour chaque fichier, et de stocker un mappage entre les chaînes de caractères et le nom de fichier réel ou identifiant de fichier. Aucun chiffrement complexe requis.

Editer: Vous devrez quand même enregistrer la date pour implémenter l'expiration des liens. Donc, vous pouvez stocker la date d'expiration, un long avec la clé, et périodiquement éliminer les liens expirés de la table.

+0

Eh bien oui décodées Je sais, comme je le disais, si possible, je préfère ne pas stocker des données supplémentaires , parce que les liens devraient aussi être valides pour une courte période de temps, ce qui nécessite de générer beaucoup d'entre eux (qui devraient aussi être nettoyés s'ils sont obsolètes) ... –

+0

J'irais quand même avec cette approche. voir mon edit. –

+0

En outre, notez que vous pouvez supprimer les liens expirés par exemple qu'une seule fois par jour, vous n'avez pas besoin de planifier une action à l'heure exacte de l'expiration. – Krab

0

Si votre problème n'est qu'un problème de cryptage et de décryptage des chaînes courtes, le module Crypto de Python simplifie la tâche.

+0

Cest ce que l'exemple mentionné dans ma question est sur ... –

0

Vous pouvez encoder n'importe quel caractère dans l'URL, avec django, vous pouvez l'utiliser urlencode filter. Toutefois, la génération d'une chaîne aléatoire et l'enregistrement du mappage sont plus sécurisés.

+0

Si vous lisez l'exemple donné dans la question, vous verrez que je l'ai fait, mais si j'utilise le codé chaîne dans les URL comme/endcoded_string/et non comme un paramètre GET, le serveur me donne l'erreur http 400. –