Yubikey - Reprogrammer
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 :
Et j'en ai profité pour employer la lib python permettant de valider, ce qui me permettra de faire des checks :
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
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