Yubikey - Reprogrammer

Ajouté le 09.12.2009 - 19:48  •  Commentaires (3)  • 

J'en avais parlé dans un autre post, en disant que Yubikey était pas mal, opensource etc.

Après avoir réussi à convaincre des collègues que ça pouvait avoir une réelle utilité pour éviter des brut-force et ajouter une clef de validation pour le login, je me suis penché sur la partie "faire un serveur de validation".

Après pas mal de recherches sur le net, je suis tombé sur une petite librairie python qui me semble très intéressantes : http://code.google.com/p/yubikey-python.

En deux temps trois mouvements, vous pouvez sans autre monter votre petit serveur de validation d'OTP. Enfin... presque.

Le presque tient au fait que Yubico ne fournit plus les clefs AES des yubikey (je n'ai pas cherché à savoir, j'imagine que les gens savaient pas comment lire un mail crypté gpg, et que Yubico avait un peu de peine à faire valoir leur sécurité si les clefs AES se balladaient en clair dans des mails ;) ).

Mais, bien entendu, il y a une parade : http://code.google.com/p/yubikey-personalization/
Ce programme permet de changer les données de sa yubikey, à savoir son ID publique, son ID privée et la fameuse clef AES.
Il va sans dire qu'un fois reprogrammée, on ne peut pas retrouver la clef d'origine.

Quoi qu'il en soit, Yubico a prévu la chose, et permet de mettre ses propres infos sur leur site, dans le cas où on voudrait employer leurs serveurs de validation. Bien que je n'en vois pas trop l'intérêt, en fait. 'Fin bon, tout est ouvert ;).

Fort de ces 2-3 choses, j'ai commencé à vouloir reprogrammer une de mes clefs. J'ai donc créé un petit script python qui va me générer du petch me permettant de refaire ma clef :
#!/usr/bin/env python
from random import seed, choice
from datetime import datetime
from string import letters

__string = 'abcdef0123456789'
__aes_size = 32
__priv_size = 12
__pub_size = 6


__hexHexChars = '0123456789abcdef'
__modHexChars = 'cbdefghijklnrtuv'

__hex2ModDict = dict(zip(__hexHexChars, __modHexChars))
__mod2HexDict = dict(zip(__modHexChars, __hexHexChars))

def __modhex_encode(s):
    return ''.join(
        [ __hex2ModDict[c] for c in s.encode('hex') ]
    )
# end def modhex_encode

def __modhex_decode(m):
    return ''.join(
        [ __mod2HexDict[c] for c in m ]
    ).decode('hex')
# end def modhex_decode

def __rand(size,array):
  seed(datetime.now())
  return ''.join([choice(array) for x in xrange(size)])

__aes  =  __rand(__aes_size, __string)
__priv = __rand(__priv_size, __string)
__pub  = __modhex_encode(__rand(__pub_size, letters))

print '''ykpersonalize -a%s -ouid=%s -ofixed=%s''' % (__aes, __priv, __pub)


Et j'en ai profité pour employer la lib python permettant de valider, ce qui me permettra de faire des checks :
#!/usr/bin/env python

import sys
from yubikey import decrypt

__aes = raw_input(Please enter your AES Key)

__otp = raw_input('Please enter your OTP: ')


try:
  yubikey = decrypt.YubikeyToken(__otp, __aes)
except decrypt.InvalidAESKey:
  print 'Wrong AES'
  sys.exit(1)
except decrypt.InvalidToken:
  print 'Wrong Token'
  sys.exit(2)

for d in dir(yubikey):
  print d, eval("yubikey.%s"%d)


Une fois cela fait.... Il ne reste plus qu'à trouver une application à tout cela. Dans le cadre de mon travail au Bureau, c'est le cas. Pour le privé par contre, c'est un peu plus gadget, mais j'aurais aussi de quoi jouer un peu.

Bref. De belles soirées de geeks en perspective ;)

A+

Tengu

Commentaires



Tengu, le 10.12.2009 - 13:19

Pour info, le service est présent ici:
https://yubico.internux.ch/

Par contre, je n'ai pas encore fait de quoi ajouter des clefs de manière simple; cela sera fait peut-être d'ici la semaine prochaine, via un formulaire + validation (automatique, sans doute)

swekey, le 11.12.2009 - 09:21

Dans le genre vous pouvez aussi utiliser la swekey qui est déjà supportée par de nombreuses applis Open Source.

On peut même l'utiliser pour sécuriser un accès SSH.

Avec la swekey il n'y même plus besoin de presser un bouton et les sites web peuvent détecter le débranchement pour effectuer un logout automatique.

Tengu, le 11.12.2009 - 19:00

Hmmm, le fait de pouvoir détecter si une clef est branchée peut être intéressant, pour autant que cela soit réellement supporté par tous les navigateurs.

Après, opensource ok, mais où peut-on avoir les algo employés etc ? Même pour la partie serveur de validation, on doit manifestement passer par leur support :/

M'enfin, toujours intéressant de voir les autres solutions existantes sur le marché ;)

Ajouter un commentaire

Pseudonyme :
Mail (non affiché) :
Site web :
Commentaire :
dix + cinq = ?