Projet

Général

Profil

Development #31268

Templatetag pour générer un jeton aléatoire

Ajouté par Benjamin Dauvergne il y a environ 5 ans. Mis à jour il y a environ 5 ans.

Statut:
Fermé
Priorité:
Normal
Assigné à:
Version cible:
-
Début:
11 mars 2019
Echéance:
% réalisé:

0%

Temps estimé:
Patch proposed:
Oui
Planning:

Description

Syntaxes proposés:

{% random-decimal 4 %} -> 7585
{% random-alphanum 5 %} -> 17UX4 (majuscules + chiffres - {1, I, 0, O})
{% random-decimal 4 seed1 seed2 as jeton %} -> code secret sur 4 chiffres lié au hash de seed1 seed2 stocké dans variable jeton

Dans le cas sans graîne on doit stocker par ailleurs ce code, dans le cas avec
graîne il faut récupérer la graîne avant de regénérer et valider lors du test.


Fichiers

0001-templatetags-add-tags-for-token-generation-validatio.patch (4,34 ko) 0001-templatetags-add-tags-for-token-generation-validatio.patch Benjamin Dauvergne, 11 mars 2019 14:52
0001-templatetags-add-tags-for-token-generation-validatio.patch (4,73 ko) 0001-templatetags-add-tags-for-token-generation-validatio.patch Benjamin Dauvergne, 11 mars 2019 15:13
0001-templatetags-add-tags-for-token-generation-validatio.patch (4,61 ko) 0001-templatetags-add-tags-for-token-generation-validatio.patch Benjamin Dauvergne, 12 mars 2019 07:53
0001-templatetags-add-tags-for-token-generation-validatio.patch (3,77 ko) 0001-templatetags-add-tags-for-token-generation-validatio.patch Benjamin Dauvergne, 12 mars 2019 10:57
0002-templatetags-add-token-generation-with-seeds-31268.patch (3,47 ko) 0002-templatetags-add-token-generation-with-seeds-31268.patch Benjamin Dauvergne, 12 mars 2019 10:57
0001-templatetags-add-tags-for-token-generation-validatio.patch (4,13 ko) 0001-templatetags-add-tags-for-token-generation-validatio.patch Benjamin Dauvergne, 04 avril 2019 12:08
0002-templatetags-add-token-generation-with-seeds-31268.patch (3,85 ko) 0002-templatetags-add-token-generation-with-seeds-31268.patch Benjamin Dauvergne, 04 avril 2019 12:08
0001-templatetags-add-tags-for-token-generation-validatio.patch (4,07 ko) 0001-templatetags-add-tags-for-token-generation-validatio.patch Benjamin Dauvergne, 04 avril 2019 18:04
0002-templatetags-add-token-generation-with-seeds-31268.patch (3,85 ko) 0002-templatetags-add-token-generation-with-seeds-31268.patch Benjamin Dauvergne, 04 avril 2019 18:04

Révisions associées

Révision bbeb4033 (diff)
Ajouté par Benjamin Dauvergne il y a environ 5 ans

templatetags: add tags for token generation/validation (#31268)

- add {% token_decimal n } > n digits random token
add {
token_alphanum n %} > n digits/uppercase-letters (without
0,1,I and O) random token
token1|token_check:token2 -> verify token1 is equal to token2
insensitive to case and prefix/suffix spaces.

Historique

#1

Mis à jour par Frédéric Péters il y a environ 5 ans

{% random-decimal 4 %} -> 7585

Pas sûr que les tirets passent; mais avant ça, c'est pour quoi faire ?

#2

Mis à jour par Benjamin Dauvergne il y a environ 5 ans

C'est pour mettre en place un formulaire d'appairage complètement géré par nous coté CD06 avec envoie du code via mail/mobile venant du logiciel métier, il n'y a pas encore de ticket coté CD06 tout est passé par mail.

L'idée est de demander le numéro de dossier à la personne, de récupérer son profil depuis le logiciel métier, d'afficher :

Recevoir un code d'appairage par :
( ) SMS sur le 06-..-..-..-93
( ) mail sur g.......y@gmail.com

de générer un code via le templatetag, le stocker dans une donnée de traitement puis envoyer le code sur le dit numéro de mobile/ou l'email.

J'ai ajouté l'histoire des seeds parce qu'on pourrait aussi ne pas le stocker en faisant juste {% random-decimal 4 form_number dossier_data_mobile %}.

Idéalement il faudrait limiter le mombres de soumissions à 3 avant d'obliger à soumettre une nouvelle demande.

Une fois cette validation faite on crée une liaison sans validation coté logiciel métier, cette liaison devrait être temporaire (mais c'est un autre sujet qui concerne cette fois le connecteur).

#3

Mis à jour par Benjamin Dauvergne il y a environ 5 ans

#4

Mis à jour par Benjamin Dauvergne il y a environ 5 ans

J'ai changer les noms et ajouter un filtre :
  • {% token_decimal 4 %} -> 1234
  • {% token_alphanum 5 %} -> AB345
  • {% token_decimal 4 seed1 seed2 %} -> 1234 déterministe par rapport à seed1 et seed2
  • {% if token1|token_check:token2 %}ok{% endif %} vérifie que token1 == token2 en ignorant la casse (pour le cas alphanum) j'hésite à ajouter des .strip()
#6

Mis à jour par Frédéric Péters il y a environ 5 ans

Vraisemblablement soucis de copié/collé,

+@register.simple_tag
+def standard_text(text_id):
+    return mark_safe(TextsDirectory.get_html_text(str(text_id)))
#7

Mis à jour par Thomas Noël il y a environ 5 ans

Je retirerais token_check, parce qu'un simple « token_saisi == token_enregistre » fera l'affaire et n'a pas besoin de documentation particulière ; s'il faut être plus souple sur la casse et les espaces cela pourra être « token_saisi|cut:" "|upper », au choix de la personne qui configure l'affaire.

#8

Mis à jour par Benjamin Dauvergne il y a environ 5 ans

Thomas Noël a écrit :

Je retirerais token_check, parce qu'un simple « token_saisi == token_enregistre » fera l'affaire et n'a pas besoin de documentation particulière ; s'il faut être plus souple sur la casse et les espaces cela pourra être « token_saisi|cut:" "|upper », au choix de la personne qui configure l'affaire.

C'est typiquement le genre d'endroit/moment (ergonomie/sécu) où on n'a pas envie de réfléchir justement, IMHO (quitte à redonder un peu je trouve).

#9

Mis à jour par Benjamin Dauvergne il y a environ 5 ans

Aussi si vous avez des remarques plus sur le fond ça m'intéresse (genre si vous pensiez à d'autres façons d'assurer ce scénario).

#12

Mis à jour par Frédéric Péters il y a environ 5 ans

{% random-alphanum 5 %} -> 17UX4 (majuscules + chiffres - {1, I, 0, O})

Dans le patch il n'y a pas non plus XYZ ?

random.SystemRandom()

À d'autres endroits on instancie une seule fois un objet depuis le random.SystemRandom().

Si l'histoire des seeds ne va pas être utilisée, je serais pour ne pas la mettre dans le code.

     if length > 100:
        return 'ERROR**TOKEN TOO LONG'

Je ne vois pas la motivation à gérer cette situation ainsi, soit accepter n'importe quoi, soit exploser davantage, que ça laisse une trace dans les erreurs logguées.

#14

Mis à jour par Benjamin Dauvergne il y a environ 5 ans

Frédéric Péters a écrit :

{% random-alphanum 5 %} -> 17UX4 (majuscules + chiffres - {1, I, 0, O})

Dans le patch il n'y a pas non plus XYZ ?

Ok, problème de révision de l'alphabet.

random.SystemRandom()

À d'autres endroits on instancie une seule fois un objet depuis le random.SystemRandom().

Si l'histoire des seeds ne va pas être utilisée, je serais pour ne pas la mettre dans le code.

[...]

Je suis un peu en avance de phase sur la réflexion de Mike donc je ne sais pas garantir que ce ne sera pas utilisé, je pensais que ça forcerait à avoir un code toujours valable tant que mail/mobile ne changent pas mais en fait en intégrant form_number aux graines ça rend le code unique par demande de raccordement.

Je ne vois pas la motivation à gérer cette situation ainsi, soit accepter n'importe quoi, soit exploser davantage, que ça laisse une trace dans les erreurs logguées.

Ok.

#17

Mis à jour par Frédéric Péters il y a environ 5 ans

Je notais :

À d'autres endroits on instancie une seule fois un objet depuis le random.SystemRandom().

C'est quelque chose que j'aimerais avoir ici aussi.

  1. 128bits security is enough; for alphanum, 128 / log(32) = 36.9...

On comprends que ça explique le > 37 qui suit mais ça mériterait un peu de contexte avant pour dire de quelle sécurité on parle et pourquoi 128 bits est suffisant. Aussi, la longueur devrait dépendre de la taille de l'alphabet, non ? (genre l'appel token_decimal demanderait une longueur supérieure).

À ce sujet, mettre une valeur par défaut aux paramètres length ?

#18

Mis à jour par Benjamin Dauvergne il y a environ 5 ans

Frédéric Péters a écrit :

Je notais :

À d'autres endroits on instancie une seule fois un objet depuis le random.SystemRandom().

C'est quelque chose que j'aimerais avoir ici aussi.

Ok.

  1. 128bits security is enough; for alphanum, 128 / log(32) = 36.9...

128bits d'entropie est la sécurité suffisante en général, pas besoin de plus; un attaque brute force est largement impossible, c'est totalement arbitraire mais souvent cité; mais j'ai viré la condition, si un client veut générer un token de 100 caractère tant pis pour lui.

On comprends que ça explique le > 37 qui suit mais ça mériterait un peu de contexte avant pour dire de quelle sécurité on parle et pourquoi 128 bits est suffisant. Aussi, la longueur devrait dépendre de la taille de l'alphabet, non ? (genre l'appel token_decimal demanderait une longueur supérieure).

Je vire tout ça c'est juste pas utile d'en discuter; et oui à difficulté équivalente decimal demande à être plus long, on l'expliquera éventuellement dans la doc.

À ce sujet, mettre une valeur par défaut aux paramètres length ?

Ok j'ai mis 6 pour décimal (au pif ça correspond à une longueur fréquente pour des OTPs style 3D-Secure ou OATH) et 4 pour alphanum (ça correspond à peu près au même niveau de sécurité, log(10^6)/log(28) = 4.14).

Pour ne pas penser à tout ça on peut aussi prévoir d'envoyer un nouveau code à chaque essaie dans le workflow concerné.

#20

Mis à jour par Frédéric Péters il y a environ 5 ans

Tu peux juste faire ''.join([r.choice(alphabet) for x in range(length)]

#22

Mis à jour par Frédéric Péters il y a environ 5 ans

  • Statut changé de Solution proposée à Solution validée

oK 0001.

#23

Mis à jour par Benjamin Dauvergne il y a environ 5 ans

  • Statut changé de Solution validée à Résolu (à déployer)
commit bbeb4033ba21fbfcdbdd640a2d4a345139f68297 (HEAD -> master, origin/master, origin/HEAD)
Author: Benjamin Dauvergne <bdauvergne@entrouvert.com>
Date:   Mon Mar 11 14:41:08 2019 +0100

    templatetags: add tags for token generation/validation (#31268)

    - add {% token_decimal n %} -> n digits random token
    - add {% token_alphanum n %} -> n digits/uppercase-letters (without
      0,1,I and O) random token
    - token1|token_check:token2 -> verify token1 is equal to token2
      insensitive to case and prefix/suffix spaces.

#24

Mis à jour par Frédéric Péters il y a environ 5 ans

  • Statut changé de Résolu (à déployer) à Solution déployée

Formats disponibles : Atom PDF