Yubikey – IV – Accès en VBA – 2 – HMAC-SHA1

Dans l’article précédent, j’ai présenté comment utiliser la bibliothèque de Yubico pour accéder à la Yubikey.

Dans cet article, je supposerai donc qu’Excel est configuré pour utiliser la bibliothèque de Yubico.

L’objectif cette fois ci ne vas pas simplement être de lire un numéro de série, mais d’utiliser le mode HMAC-SHA1, toujours dans le cadre d’opérations de lecture. Pour les accès en écriture, cela fera l’objet d’un autre article. Pour rappel le mode HMAC-SHA1 est celui utilisé entre autre, pour protéger l’accès à sa session Windows.

HMAC-SHA1

En préalable à la réalisation de l’application, revoyons comment fonctionne le mode HMAC-SHA1.

SHA1 : est une fonction de hachage cryptographique. (Plus de détail sur Wikipedia). Cette fonction produit une signature unique sur 160 bits à partir d’un ensemble de données qui lui est adressé. Ça peut être un fichier, une phrase, un texte, …. Dès que la moindre information des données sources changent, la signature SHA1 est différente. Cela permet entre autre de garantir l’intégrité des données.

HMAC : est un code d’authentification de message qui combine un hachage cryptographique (SHA1 par exemple) et une clef secrète partagée. La clef secrète est intégrée dans le calcul du SHA1 (pour plus de détail sur l’algorithme, voir Wikipedia).

HMAC-SHA1 est utilisé au sein de protocoles, comme TLS, IPsec, ou encore à la fin d’URL afin d’authentifier les informations transmises.

En ce qui concerne la Yubikey, la clef secrète y est enregistrée au moment ou nous la programmons et est non extractible. Ensuite lorsque l’on envoie une suite d’octets, d’une longueur maximale de 64 octets, la Yubikey nous renvoie le résultat de la fonction HMAC-SHA1 appliqué à cette suite d’octets.

Pour de l’authentification, c’est parfait. Il est possible de dériver deux sortes d’utilisation pour assurer la fonction d’authentification :

Authentification avec partage de clef

Le programme qui se charge de l’authentification connaît la clef qui est enregistré sur la Yubikey.

Voici les différentes étapes suivies pour procéder à l’authentification :

hmacYubikey1

  1. Le programme génère une chaîne aléatoire, puis calcule la signature HLMAC-SHA1 avec la clef secrète.
  2. Le programme envoie dans le buffer tampon de la Yubikey la même chaine aléatoire
  3. La Yubikey calcule la signature HMAC-SHA1 avec la clef secrète qu’elle connaît et la chaîne aléatoire de la mémoire tampon. Elle stocke le résultat dans la mémoire tampon.
  4. Le programme va lire la mémoire tampon.
  5. Il compare son calcul HMAC-SHA1 avec celui de la Yubikey. Si les résultats sont égaux, alors la Yubikey est reconnue.

A noter, et c’est le but, que la clef secrète n’est jamais échangée.

L’avantage de cette solution est sa simplicité. Son inconvénient est qu’il faut connaître la clef secrète stockée dans la Yubikey pour pouvoir l’enregistrer dans le programme. De même il faut être certain de la robustesse du programme afin qu’il protège correctement la clef secrète.

Authentification avec stockage du HMAC-SHA1

A l’inverse du cas précédent, le programme ne connaît pas la clef secrète de la Yubikey. L’opération se déroule en deux étapes.

Dans la première étape, la Yubikey va être enregistrée dans le système.

hmacYubikey2

  1. Le programme envoie dans le buffer tampon de la Yubikey une chaine aléatoire.
  2. La Yubikey calcule la signature HMAC-SHA1 avec la clef secrète qu’elle connaît et la chaîne aléatoire de la mémoire tampon. Elle stocke le résultat dans la mémoire tampon.
  3. Le programme va lire la signature dans mémoire tampon et stocke le résultat, avec la chaîne aléatoire.

Cette première étape n’est à faire qu’une seule fois, lorsque l’on enregistre la Yubikey comme système d’authentification.

Ensuite, pour chaque authentification, le procédé est le suivant :

hmacYubikey3

  1. Le programme envoie dans le buffer tampon de la Yubikey la chaine aléatoire préalablement stockée.
  2. La Yubikey calcule la signature HMAC-SHA1 avec la clef secrète et la chaîne aléatoire de la mémoire tampon. Elle stocke le résultat dans la mémoire tampon.
  3. Le programme va lire la signature dans mémoire tampon
  4. Le programme compare la signature de la Yubikey avec celle qu’il a stocké. Si les deux signatures sont identiques, alors c’est la bonne Yubikey qui est présentée, l’authentification est valide.
  5. Le programme génère une nouvelle chaine aléatoire qu’il envoie dans la mémoire tampon
  6. La Yubikey calcule la signature HMAC-SHA1 de cette nouvelle chaine et stocke le résultat dans la mémoire tampon
  7. Le programme va lire la signature HMAC-SHA1 dans la mémoire tampon, et stocke le résultat ainsi que la chaine aléatoire pour la prochaine authentification.

L’avantage de cette solution est que la chaine secrète ne quitte jamais la Yubikey. Si le programme est compromis, la Yubikey ne l’est pas. Elle est un peu plus complexe à mettre en œuvre.

 

C’est cette solution qui est utilisée dans l’article sur la sécurisation de sa session Windows.

Programme de lecture d’une signature HMAC-SHA1 générée par une Yubikey

Après la théorie, un peu de pratique….
L’objectif du programme que je présente ici est de transmettre à la Yubikey une chaine de 64 octets et de récupérer en retour sa signature HMAC-SHA1.

Pour tout ce qui concerne la préparation d’Excel et l’intégration de la bibliothèque de Yubico, on peut se référer à l’article qui présente les bases de l’accès à la Yubikey en VBA.

Voici à quoi ressemble l’interface utilisateur :

hmacYubikey4La composition de l’interface est faite de :

  • Un champs de saisie pour le n° de série, nommé dfNumSerie
  • Un bouton pour générer une chaine aléatoire, nommé pbSetString
  • Un champs de saisie pour afficher la chaîne aléatoire, nommé dfSetString
  • Un bouton pour envoyer la chaine à la Yubikey et récupérer la signature HMAC-SHA1, nommé pbHMAC
  • Un champs de saisie pour afficher la signature en Hexadécimal, nommé dfGetString
  • Un champs de saisie pour afficher la signature en Base64, nommé dfGetStringBase64

Voici le code correspondant :

Option Explicit
Dim WithEvents obj As YubiClientAPILib.YubiClient
Const challengeSize = 63
 
'* Procédure d'appel de la Yubikey pour calculer la signature HMAC-SHA1
'* Appel à la bibliothèque de la Yubikey en Mode bloquant
Private Sub pbHMAC_Click()
    Dim challenge, reponse As String
    Dim retour As Integer
 
    challenge = dfSetString.Value
    obj.dataEncoding = ycENCODING_BSTR_HEX_SPACE
    obj.dataBuffer = challenge
    retour = obj.hmacSha1(2, ycCALL_BLOCKING)
    If retour <> ycRETCODE_OK Then
        MsgBox ("Erreur de récupération HMAC-SHA1 : " & retour)
    Else
        obj.dataEncoding = ycENCODING_BSTR_HEX_SPACE
        reponse = obj.dataBuffer
        dfGetString.Value = reponse
        obj.dataEncoding = ycENCODING_BSTR_BASE64
        reponse = obj.dataBuffer
        dfGetStringBase64.Value = reponse
    End If
 
End Sub
'* Procédure de Génération d'une chaine aléatoire
'* Le résultat est stocké dans le champs de saisie dfSetSting
Private Sub pbSetString_Click()
   Dim challenge As String
   Dim alea, i As Integer
 
    Randomize
    For i = 1 To challengeSize
        alea = (Int(255) * Rnd) + 1
        If alea < 9 Then
            challenge = challenge & " 0" & Hex(alea)
        Else
            challenge = challenge & " " & Hex(alea)
        End If
    Next i
    challenge = LCase(challenge)
    dfSetString.Value = challenge
 
End Sub
'* Affichage automatique à l'ouverture de la feuille Excel
Private Sub UserForm_Activate()
    Dim retour As Integer
    Dim numserieh As String
 
    Set obj = New YubiClient
    If obj.isInserted = ycRETCODE_OK Then
        retour = obj.readSerial(ycCALL_BLOCKING)
        obj.dataEncoding = ycENCODING_UINT32
        numserieh = obj.dataBuffer
        dfNumSerie.Value = numserieh
    Else
        dfNumSerie.Value = "Pas trouvé !"
    End If
End Sub

La partie intéressante se trouve dans la procédure qui s’exécute lorsque l’on clique sur le bouton HMAC-SHA1.

On précise que dans le buffer on dépose des données au format hexadécimal, séparé par des espaces :

   obj.dataEncoding = ycENCODING_BSTR_HEX_SPACE

On dépose la chaîne dans le buffer, puis on appelle la fonction de calcul HMAC-SHA1.

retour=obj.hmacSha1(2, ycCALL_BLOCKING)

Le premier paramètre précise le slot (j’ai programmé ma Yubikey pour que HMAC-SHA1 soit sur le slot 2)
Le second paramètre spécifie un appel bloquant.

On récupère une première fois le résultat en précisant qu’on le veut en Hexa séparé par des espaces :

       obj.dataEncoding = ycENCODING_BSTR_HEX_SPACE
        reponse = obj.dataBuffer
        dfGetString.Value = reponse

Il n’est pas nécessaire de re-préciser l’encodage du buffer puisqu’on l’a fait préalablement, je l’ai juste fait pour la lisibilité.

On récupère ensuite une seconde fois le résultat en base 64 :

      obj.dataEncoding = ycENCODING_BSTR_BASE64
        reponse = obj.dataBuffer
        dfGetStringBase64.Value = reponse

Sur ce principe on peut imaginer de créer des feuilles Excel avec du code VBA qui sont bloquées tant que la Yubikey n’est pas insérée.

Le fichier exemple est téléchargeable ici : Excel-hmac-sha1

Posts relatifs

Laisser un commentaire


NOTE - Vous pouvez utiliser les éléments et attributs HTML tags and attributes:
<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong> <pre lang="" line="" escaped="" cssfile="">