Signature électronique

Signaler
Messages postés
7
Date d'inscription
mercredi 9 août 2006
Statut
Membre
Dernière intervention
17 août 2006
-
Messages postés
1
Date d'inscription
mercredi 1 février 2006
Statut
Membre
Dernière intervention
25 septembre 2006
-
Bonjour,

Je cherche à créer un système de signature électronique pour du personnel intervenant sur des fichiers excels, sans avoir à retouché le code si du personnel s'ajoute. Le fonctionnement serait le suivant:
- L'utilisateur fini une tache, et insère la date dans une cellule, ce qui déclenche une macro de mot de passe.
- une userform s'ouvre, le technicien saisie son mot de passe (crypté ***), et appuie sur Ok
(j'utilise un autre fichier excel, qui me sert de base de données pour le personnel, ce fichier contient dans une colonne le mot de passe, et dans une autre colonne (en face), le chemin de leur signature correspondante (*:\*****\****.jpg), ce système me permettra de rajouter du personnel et modifiant cette bdd sans toucher au code, ni à d'autres fichiers excel.)
- je fais ensuite une recherche verticale dans la macro, qui, en fonction du mot de passe, va me chercher le chemin de l'image de la signature
- j'insère ensuite la photo dans une cellule (ou ensemble de cellule) bien précise.

En théorie, c'est trés bien, mais en pratique, je rencontre quelques problèmes:
- pour la textbox, je n'y parviens pas, je fais pour l'instant avec un inputbox (les caractères saisis ne sont donc pas cryptés)
- j'arrive à trouver le chemin de la photo, je l'affiche (avec une msgbox), mais lorsque je veux insérer la photo (activesheet.pictures.insert(chemin)),  cette commande me fais une erreur, comme si elle ne pouvais pas insérer un chemin qui à été trouvé à l'aide d'une recherche verticale (le chemin change en fonction du mot de passe saisi)
- Autre problème, il faudrait que ce code soit une fonction de excel (function) car il y a de nombreux endroits où cette signature servira, et dans de nombreux documents

Voilà, j'ai essayé d'être le plus clair possible, mais ce n'est pas évident, donc, aprés de nombreuses recherches, je cherche quelqu'un qui pourrait m'aider.
Merci par avance

12 réponses

Messages postés
797
Date d'inscription
mardi 7 juin 2005
Statut
Membre
Dernière intervention
23 février 2011
7
Soit dit entre nous, si ta liste de mot de passe et des utilisateurs est dans un fichier Excel, la sécurité du truc n'est pas vraiment assurée ^^

Sinon, étant par nature anti-formulaire, je te présente une solution qui fonctionne avec 2 ou 3 petits aménagements, tu pourras adapter à ton cas sans soucis je pense.

Mise en place :
Un fichier Excel gérant tes utilisateurs et mots de passe : Données.xls
Colonne A : Les utilisateurs
A1: Toto
A2 : Tata
A3 : Titi
Colonne B : Les mots de passe
B1: 123
B2: 456
B3: 789
Colonne C : Concaténation des 2 (en effet, ce que tu vas contrôler, c'est bien que le mot de passe corresponde à 1 utilisateur)
C1: =A1 & B1
C2: =A2 & B2
C3: =A3 & B3
Colonne D : Chemin de l'image
D1: C:\Signature\Toto.jpg
D2: C:\Signature\Tata.jpg
D3: C:\Signature\Titi.jpg
(A ce propos, comme tes images bougeront peut être, rentrer les chemins en dur est bien fastidueux je trouve, tu ferais mieux de fonctionnenr en chemin relatif : Un sous répertoire à l'endroit où tu mets ton fichier Excel pour stocker les signatures, tu n'as plus qu'à rentrer le nom du fichier image sans t'occuper du chemin et ça fonctionnera nickel. Surtout si tu es amené à déplacer ton appli).

Je sélectionne les cellules C1 à D3 et je crée une zone de nom :
Menu Insertion\Nom\définir et je lui donne le nom ControlePw. (à noter que si tu adaptes à ton cas, il faut absolument que la colonne contenant la concaténation soit la 1ere de la zone crée, sinon, ça ne fonctionnera pas).

Mon premier fichier est prêt.

Deuxième fichier, celui qui figurera ton interface. J'ai fait au plus simple, tu adapteras :
En B1 se situe la cellule où ton utilisateur rentrera son nom, son matricule, etc ... (tu peux même faire une liste de saisie à partir du fichier Excel où la liste des utilisateurs est enregistrée, pour être sûr de la saisie).
En B2 se situe la cellule où sera tapé le mot de passe (effectivement, il sera en clair, mais tu peux t'arranger, y a plein de moyens en jouant sur les protections de cellule, de feuilles ...)
Les bases sont données : Il te reste une chose à faire, vérifier que les éléments saisis sont corrects, sont bien liés et remonter l'image.

Dans la cellule B3, je vais rentrer une formule qui va m'afficher le chemin de l'image si le nom d'utilisateur et le mot de passe sont trouvés et bien liés (si tu veux que ça reste caché, tu peux mettre cette formule dans une autre feuille d'Excel et la masquer).
B3: =SI(ESTERREUR(RECHERCHEV(B1&B2;'C:\Données.xls'!ContrôlePw;2;FAUX))=VRAI;"Nok";RECHERCHEV(B1&B2;'C:\Données.xls'!ContrôlePw;2;FAUX))
Que fait cette formule ?
RECHERCHEV(B1&B2;'C:\Données.xls'!ContrôlePw;2;FAUX) va chercher dans la zone de nom qu'on a crée si la concaténation du nom d'utilisateur et du mot de passe existe, et afficher la 2eme colonne de la zone.
Donc, si en B1 on a Tata et en B2 456, cela va remonter C:\Signature\Tata.jpg dans la cellule. Si ça ne trouve rien, #N/A.
D'où la formule ESTERREUR : si la remontée est #N/A, la cellule contiendra VRAI, autrement, FAUX.
Et j'insère maintenant ma fonction SI qui dit que si une erreur est remontée, la cellule B3 affiche Nok, et autrement, elle affiche le chemin de la signature.

Ma toute petite tricherie à présent : je n'arrive pas à insérer l'image dans une cellule via le code. La macro enregistrée ressort un code qu'à priori, Excel n'arrive pas à interpréter O_o.
Pas grave, on crée un objet Image qui restera de toutes façons attachées à une cellule.

Et on crée un Bouton, que tu appelles comme tu veux : Mise à jour, Signature, etc ...

On colle ce tout petit bout de code :

Private Sub CommandButton1_Click()
   
    Dim Temp As String
    Temp = Worksheets("Feuil1").Range("B3").Value
    If Temp <> "Nok" Then
        Image1.Picture = LoadPicture(Temp)
    End If
   
   
End Sub

Je précise le Woksheets parce que je suppose que ton fichier ne fera pas qu'une feuille, et en fonction de l'endroit où tu affiches le chemin de l'image, tu en auras besoin.

Voilà, ton fichier est donc prêt :
Pour la mise à jour, il n'y a qu'une seule chose à faire : quand tu rajoutes des utilisateurs, pense à agrandir la zone de Nom ControlePw pour que les nouveaus soient pris (ou insère les avant la dernière ligne, comme ça, la zone de Nom s'agrandit automatiquement).

Dernière chose : Ca fonctionne bien, très bien même, mais ce n'est pas très sécurisé . D'un autre côté, je ne comprends pas l'intêret de mettre la liste de mot de passe dans un fichier Excel que n'importe qui pourra consulter (même protégé, oon trouve toujours une astuce, sans compter que ça se "crack" très facilement donc )

Molenn.
Messages postés
7
Date d'inscription
mercredi 9 août 2006
Statut
Membre
Dernière intervention
17 août 2006

Merci Molenn,


Je te remercie pour la rapidité de ta réponse: ca a pas trainer.Alors, première chose, il faut absolument que le code soit entrer dans une textbox (il ne faut pas qu'on puisse lire ce que le technicien entre).


Deuxième chose, pour l'objet image, je ne peux pas procéder ainsi vu le nombre de signature élec à faire (environ 300). c'est pour cela qu'il me faut absolument utiliser "function", pour que je puisse ciblé des cellules, qui serviront au déclenchement, au positionnement de l'image, à son dimensionnement. Si tu préfère, je peux avoir 5 signature élec dans une seule feuille, donc faire avec des objets me semble trop long. L'idée est d'avoir une cellule où le technicien insère la date du jour, cette action génére l'ouverture de la textbox, il entre son code, et lorsqu'il valide, sa signature s'insère dans la cellule (désigné dans function), et à son format.
En fait, ce qu'il me faudrais (je sais pas si ca existe), c'est la commande d'insertion d'image, mais qui accepte une variable à la place du chemin d'accés "".

Niveau sécurité, je suis celui qui s'y connais le plus de la boite, alors t'inquiète pas pour le "crackage" des fichiers, ca risque pas.
L'intéret du mot de passe est le suivant: je travaille dans l'aero, et toutes les actions doivent etre signé, mais en ce moment, c'est fait plus ou moins à la fin , avec une copie du document en parallèle qui est renseigné (ce qui fait un doublon), ce système de signature permet de valider dans le système, et de pas avoir à resigné à la fin.

J'ai pas eu le temps de tester ta soluce, mais je le fais demain à la première heure, en tout cas, merci beaucoup pour le temps que tu y a consacrer.
@+
Messages postés
797
Date d'inscription
mardi 7 juin 2005
Statut
Membre
Dernière intervention
23 février 2011
7
Alors, après avoir fait tout plein de tests, je peux te proposer ceci :

Je garde mon classeur "Données.xls" qui contient les users, les mots de passe, la concaténation des 2 et le chemin de l'image. Par contre, tu peux laisser tomber la zone de nom.

Le 2ème fichier Excel : "Interface.xls"
Je ne me suis pas occupé de gérer l'apparition de la TextBox si la date est renseignée. Tu as l'air de savoir le faire.
J'ai donc une cellule dans laquelle sera inscrit le nom d'utilisateur (idem que le post précédent, tu peux créer liste blabla ^^) : B1
Une TextBox que j'appelle txt_MotPasse avec une "*" pour masquer la saisie.
Un bouton pour appeler la signature.
Ci-joint le code à mettre dans le bouton :

Private Sub CommandButton2_Click()
   
    Dim ID As String
    Dim Chemin As String
    Dim NumLigne As String
    Dim Image As String
   
    'Concaténation du User et du Pw
    ID = Worksheets("Feuil1").Range("B1").Value & txt_MotPasse.Text
     'Ici, j'ai donc reconstitué ce qui est normalement l'identifiant unique dans ton fichier du personnel    

    'Recherche dans le classeur du Personnel
        'Ouverture du classeur "Données.xls"
    Chemin = "C:\Données.xls" 'Je rentre le chemin en dur dans une variable, plus simple à visualiser quand ça change et puis, tu peux remplacer par un chemin relatif, à toi de voir.
    Workbooks.Open (Chemin)
        'Rendre les fichiers invisibles le temps du contrôle (sinon, ton fichier avec les mots de passe du personnel sera visible... Comme je n'ai pas crée de nouvelle instance Excel, je rends tout invisble le temps du traitement, très court).
    Application.Visible = False
        'Recherche de l'ID
    Workbooks("Données.xls").Activate
'Avec la méthode Find, je vais récupérer l'adresse de la cellule contenant l'ID, en extraire le N) de ligne et reconstituer ainsi l'adresse de la cellule contenant le chemin de l'image)
    Workbooks("Données.xls").Worksheets("Feuil1").Cells.Find(What:=ID, After:=ActiveCell, LookIn:=xlValues, LookAt _
        :=xlPart, SearchOrder:=xlByRows, SearchDirection:=xlNext, MatchCase:= _
        True, SearchFormat:=False).Activate
        'Récupération de la ligne
    NumLigne = Right(ActiveCell.Address, (Len(ActiveCell.Address) - InStrRev(ActiveCell.Address, "$")))
        'Récupération du chemin de l'image
    Image = Workbooks("Données").Worksheets("Feuil1").Range("E" & NumLigne).Value
        'Fermeture du classeur des users
    Workbooks("Données.xls").Close
        'Rendre les fichiers visibles
    Application.Visible = True
   
   
    'Affichage de l'image sélectionnée
'Là j'ai mis l'image en C34, à toi de gérer l'endroit où insérer l'image
    Workbooks("Interface.xls").Worksheets("Feuil1").Range("C34").Select
    ActiveSheet.Pictures.Insert( _
        Image _
        ).Select
   
End Sub

Tu n'as plus qu'à tester tout ça et me dire si ça te suffit.

Molenn
Messages postés
797
Date d'inscription
mardi 7 juin 2005
Statut
Membre
Dernière intervention
23 février 2011
7
Beurk la mise en page ...
Colle ça dans l'éditeur VB, ça sera tout de suite plus clair ^^

Molenn
Messages postés
7
Date d'inscription
mercredi 9 août 2006
Statut
Membre
Dernière intervention
17 août 2006

bonjour Molenn,
Tu est trés prolofique dis moi, encore merci.

Comme je te l'ai dis, ta soluce pourra s'appliquer à des fichiers "Master", mais pas encore à mes docs de travail:  mais ca tombe bien, car c'est aussi le cas: en fait,  pour remettre les pièces aéro en service, il faut compléter un document qui ne change jamais de mise en page, seul le contenu change. Quand je suis arrivé dans la boite, c'était un simple fichier excel où les utilisateur changé le contenu des cellules à modifiés (fastidieux).
J'ai tout d'abord fonctionné en rechercheV, car toutes les données à inscrire dans ces docs étaient dans un log excel. Puis j'avais déjà crée ta solution pour l'inscription du nom et du matricule en faisant un "pseudo code" (sans VB), mais l'idée d'insérer la signature me plais bien, je me renseignerais demain au niveau des autorités en ce qui concerne la sécurité (qui est légère).

Aujourd'hui donc, j'ai testé ta première soluce, en l'optimisant:
- Donc tout d'abord, il y a un bouton sur le feuille excel pour saisir le code personnel
- Ensuite, une textbox s'ouvre, demande le code, le technicien le rentre (*** c trop bien), puis valide
- le code entré est insérer dans une cellule "protégé": à savoir police de caractère illisible, police couleur blanche, et cellule protégée par mot de passe
- ensuite, sur cette même feuille, la rechercheV m'affiche le chemin
- ce chemin est récupérer dans une variable de la macro de la userform, puis insérer dans la célèbre commande "activesheet.pictures.insert(variable)" et là miracle, ca marche.
- J'ai ensuite repris un code qui permet de dimensionné à sa guise l'image, et de la placer où bon nous semble
- Le résultat final est que le doc est signé, et protégé, il ne reste plus qu'à l'imprimer.

Au niveau sécurité:
- les docs dont je te parle sont dans un répertoire sécurisé (serveur Windows 2003)
- ils sont dispo uniquement en lecture seule
- toute les feuilles sont protégées pas mot de passe
- Les docs nécessite un code (cf ci dessus) pour être finalisé
- La base de données des chemins est sous mot de passe
Je me rends bien compte que la sécurité n'est pas top, mais en même temps, vu la structure de la boîte, je pense que c'est suffisant, à voir demain avec les autorités. Sinon, il faudrais que je vérouille l'accés aux macros (à VB donc) quand un de ces fichier est utilisé, ça je sais pas faire, mais je chercherais demain (si tu as une idée...).

Enfin, pour ta deuxième soluce, je verrais ca demain parce que là, j'en peux plus, et vu que je n'ai aucune formation VB, il me faudra du temps pour la décortiqué. et je cherche encore pour lier le code avec une fonction excel, pour utiliser le glisser-déposer de excel (qui sera bien pratique)

Un grand merci à toi.

Guillaume
Messages postés
797
Date d'inscription
mardi 7 juin 2005
Statut
Membre
Dernière intervention
23 février 2011
7
Pour verrouiller l'accès aux macros de tes fichiers Excel, il te suffit de les protéger.
Pour cela, rien de plus simple, tu vas dans l'éditeur VBA, dans la partie gauche de l'éditeur, tu as d'écrit VBA Project avec le nom de ton fichier entre parenthèses.
Un clic droit dessus, propriétés de VBA Project : Onglet Protection et hop, un mot de passe de plus.
Plus personne ne pourra accéder aux macros pour les modifier (Bouton Modifier grisé Qquand on consulte la liste des macros), ni accéder au contenu via l'éditeur VBA.

Molenn
Messages postés
7
Date d'inscription
mercredi 9 août 2006
Statut
Membre
Dernière intervention
17 août 2006

Ouais, je viens juste de trouver à l'instant. En ce qui concerne les autorités, une signature électronique est possible aux conditions suivantes:


- Satisfaisante pour le représentant de l'autorité (ce qui ne veut rien dire, mais bon, j'en fais mon affaire)


- Qu'on ne puisse pas imprimer de document "en blanc" avec la signature intégré

Pour ce qui est de l'impression, j'ai verrouiller cette dernière en fonction du statut d'une cellule , qui sera lié au code entré.

Pour la sécurité, j'ai bien verrouillé partout, mais bien sur, avec un logiciel de décryptage, il sera toujours possible d'accéder aux macros, cellules protégés... Mais bon, je ne suis pas entourés de developpeurs.

Je vais encore essayer d'améliorer le fichier pour éviter d'utiliser des cellules Excel (cf ta deuxième soluce), puis j'essayerais d'en faire une fonction (mais plus ca va, et moins j'y crois, on verra).

Encore merci (vb c'est génial, j'en découvre tout les jours)
Messages postés
7
Date d'inscription
mercredi 9 août 2006
Statut
Membre
Dernière intervention
17 août 2006

Bonjour Molenn,


Petite question surement bête, mais comment fais-tu pour transférer le contenu d'une textbox d'une userform, à une variable contenu dans un module ?


Ce que je veux faire, c'est récupérer le mot de passe avec la userform, puis récupérer ce mot de passe dans un module afin de pouvoir faire une recherche verticale dans la macro. Je suis obligé de faire ce transfert si je veux en faire une fonction (function ne fonctionnant que dans les modules).


Aurais-tu une idée ? (sans passer par les cellules d'excel de préférence)
Merci encore


 
Messages postés
797
Date d'inscription
mardi 7 juin 2005
Statut
Membre
Dernière intervention
23 février 2011
7
Bonjour,

Alors, si je te comprends bien, tu veux récupérer le mot de passe saisi dans ton userform dans une variable contenue dans un module.

Alors, première chose :
Ta variable doit être déclarée de façon à ce qu'elle soit reconnue par tout le fichier.
Donc, dans ton module, elle doit être déclarée de la façon suivante :

Public Toto as String

(enfin, le type de variable est fonction de tes besoins ^^).

Ensuite, Tu peux créer un bouton dans ton userform, appelé par ex : "Se connecter" (ce qui parlera à tes utilisateurs : on leur demande de saisir un mot de passe pour accéder à quelque chose).
Et comme bout de code, il suffit de :

Private Sub CommandButton1_Click()
   
    Toto = txt_PW.Text
   
End Sub

Ton mot de passe est donc à présent stocké dans la variable de ton module, connu de tout ton programme.
Tu n'as plus qu'à insérer cette variable dans ta macro.

Si je suis à côté de la plaque, désolé ^^

Molenn
Messages postés
7
Date d'inscription
mercredi 9 août 2006
Statut
Membre
Dernière intervention
17 août 2006

Non, en fait, c'est moi qui est mal posé la question, j'ai déjà fait tout ce que tu a dis, mais il me manque la commande pour revenir au module lorsque le mot de passe est saisi, j'ai:
- la variable du code est déclarée en public dans le module
- Dans le module, je lance la userform par 'CallByName userform1."show".VbMethod
- Dans la userform, je dis que la variable code = textbox1 (quand j'appuie sur le bouton)
- Si j'affiche msgbox code, j'ai bien le code qui apparait à l'écran, ce qui veux dire que la variable est correcte
- Mais je n'arrive pas a revenir dans le module aprés, si j'affiche msgbox code dans le module, à la suite de l'appel de la userform, la msgbox apparait, mais elle est vide, j'ai perdu le contenu de ma variable.

Il doit y avoir une commande qui permet de revenir au module, ou de transférer le contenu de la variable (pourtant déclarée en public au début du module), mais je ne la connait pas.

Si tu as une idée ?!
Merci
Guillaume
Messages postés
7
Date d'inscription
mercredi 9 août 2006
Statut
Membre
Dernière intervention
17 août 2006

Correction Molenn, je viens de le faire à l'instant, et la variable est bien remplie, il me manqué un petit 'unload me' dans ma userform.


Je continu à plenché, @+


Guillaume
Messages postés
1
Date d'inscription
mercredi 1 février 2006
Statut
Membre
Dernière intervention
25 septembre 2006

Bonjour à tous j'ai une erreur vb6 ( The signer Object has not been properly initialized ) quand je veux signer un texte  .L'erreur provient de :
sig.Certificate = cert

Le code est le suivant :

Private Sub Command1_Click()
   ' On Error GoTo Err
    Dim sd As New CAPICOM.SignedData
    Dim store As New CAPICOM.store
    store.Open CAPICOM_LOCAL_MACHINE_STORE, "My", CAPICOM_STORE_OPEN_READ_WRITE
    Dim cert As New CAPICOM.Certificate
    Set cert = store.Certificates.Item(1)
    Set store = Nothing
    Dim sig As New CAPICOM.signer
    sig.Certificate = cert
    sd.Content = Text1.Text
    Text2.Text = sd.Sign(sig, True, CAPICOM_ENCODE_BASE64)
'Err:
 '  Text2.Text = Err.Description
End Sub