mardi 29 avril 2014

Première version de Troubador

Ces derniers temps, j'ai cette impression que beaucoup de services en ligne ont eu des problèmes avec des accès à leurs bases de données. Certains font d'ailleurs partie de ceux que j'utilise (comme kickstarter). Il devenait urgent que j'ai une politique de gestion de mot de passe un peu plus solide (comprendre par là en avoir plus que 2 ou 3, répartis sur tous les comptes que j'ai ouvert un peu partout).

C'est de ce constat que j'ai eu l'idée de Troubador. Il s'agit d'un générateur de mot de passe en ligne. Jusque là, rien de très original, j'en conviens. Il s'agissait surtout pour moi de m'amuser un peu avec Flask, un framework en python.

Le principe est assez simple. Tout d'abord, pas d'inscription au site. Pour s'enregistrer et se loguer, la même méthode est appliquée : il suffit de rentrer un email valide. Un mail est envoyé avec un lien permettant l'authentification sur le site. Troubador est donc un service qui génére des mots de passe mais qui n'en a pas besoin, ça change. Ensuite, il est possible de paramétrer son compte, pour choisir la longueur des mots de passe qu'on souhaite générer et les différents symboles qu'on souhaite inclure. Il suffit ensuite d'indiquer le domaine pour lequel on souhaite un mot de passe et un "master password". L'application s'occupera de créer une chaîne de caractères utilisable sur le site.

Rien ne sera stocké dans la base de données de Troubador. Uniquement les domaines pour lesquels un mot de passe a été généré. Cela veut dire que si quelqu'un arrive à se connecter à votre compte, s'il ne dispose pas du mot passe maître, il ne pourra rien faire de plus. Pour un même trio utilisateur / domaine / master password, le secret généré sera toujours identique. Ça permet de pouvoir se reloguer ultérieurement au service externe en regénérant le mot de passe.

Pour l'instant, il s'agit uniquement de la première version utilisable, notée 0.1. J'ai l'intention d'ajouter d'autres choses à l'application. En premier lieu une api pour pouvoir l'utiliser via d'autres webapps. J'aimerais qu'on puisse aussi avoir des paramètres de gestion par domaine (par exemple pour les sites des banques qui ne veulent que 8 chiffres). Il faudra que j'ajoute aussi du javascript au site et un bookmarklet pour pouvoir générer et peupler un formulaire, sans avoir à se loguer directement sur le site principal.

Bref, n'hésitez pas à tester et me faire un retour. Et puis je ne suis pas assez réactif, le code de Troubador est disponible sur gitorious, envoyez moi des patches.

mardi 14 août 2012

Optimisation python

Afin de faire une fonction en python qui permet de passer d'une base 10 à une base N, je suis tombé devant un problème d'optimisation. Voici les deux codes possibles :

def conquer(integer):
     """Turns an integer into a string representation"""
     string = []
     base = len(SYMBOLS)
     while integer:
         integer, reminder = divmod(integer, base)
         string.append(SYMBOLS[reminder])
     return "".join(string[::-1])
def conquer(integer):
     """Turns an integer into a string representation"""
     string = []
     base = len(SYMBOLS)
     while integer:
         integer, reminder = divmod(integer, base)
         string.insert(0, SYMBOLS[reminder])
     return "".join(string)

La modification porte sur les deux dernières lignes du code. Est-il plus rapide de mettre les différents éléments dans la liste puis de l'inverser pour la concaténation ou bien vaut-il mieux insérer les nouveaux éléments en début de liste ? Résultat, pour un million d'itérations de la première solution, la fonction prend 30 secondes. Avec la deuxième solution, il faut 37 secondes.

La raison de ce résultat s'explique par le fait que insert doit décaler tous les éléments à chaque nouvel ajout, ce qui prend du temps. Au contraire, inverser une liste est plutôt une opération peu couteuse en cpu (mais un peu plus en mémoire).