Constantes public et mdp

Hello tous,

Dans un classeur, pour exécuter des macros, je suis amené à déprotéger et protéger mes feuilles ou bien le classeur même.

Pour le moment, par facilité, j'ai stocké le mdp sous forme de constante publique. Mon code fonctionne bien seulement du coup si quelqu'un accède au code vba, il a acces au mdp et même si j'ai appelé la constante const1, ça se devine rapidement que c'est le mdp.

Auriez-vous une astuce à me suggérer pour brouiller les pistes, même si je sais qu'au final, quelqu'un qui cherche trouvera forcément?

Sauf erreur de ma part, pas moyen d'obfusquer des "public constant".

Merci par avance pour votre aide

Bastien

Bonjour,

Une solution pourrait consister à mettre un mot de passe à l'accès de votre projet VBA., et/ou d'obfusquer le code...

https://www.excel-pratique.com/fr/astuces_vba/mot-de-passe-vba

A+

Hello

Merci pour ton aide

J'ai mis un mdp sur le code vba

je suis en train d eregarder pour l'obfuscation mais je galere un peut (je vais persévérer).

Est ce possible de generer ces constante public via une macro qui par exemple "assemblerait" le contenu de plusieur cellule?

Bonjour,

garde à l'esprit qu'aucune protection sur excel ne résiste longtemps à qq'un de décidé.
Bon, l'obfuscation décourage quand même...

Je voulais surtout te dire de penser à garder une version non obsusquée. Sinon tu vas ramer si tu as des modifs à faire...
eric

Merci pour ta réponse

Oui, je sais que rien n'arrete qqn de déterminer :-)

Cela dit, comme tu el mentionne, le but est de décourager.

Mais j'y pense, l'obfuscation change le noms des variables mais c'est tout.
Une chaine "monMotDePasse" restera telle que, toujours autant lisible.
Si c''était le seul but, tu peux laisser tomber.

Par contre tu peux le crypter facilement avec une petite fonction utilisant XOR et un mot clé.
Chaque caractère est remplacé par un autre, ton mdp n'est plus lisible directement.
L'avantage c'est que c'est réversible, la même fonction crypte ou décrypte.
Un exemple de ce que j'avais fait.
eric

21crypter-xor.xlsm (18.13 Ko)

Edit 03/2 22:53 : version corrigée

Oui c’est ça le but en effet. J’ai déclaré une public constant qui correspond au mdp qui sert à déverrouiller les feuilles ou le classeur mais du coup si qqn craque le code du VBE, le mdp est en clair.

Je regarde ta proposition.

si jamais tu l'utilises, change le nom de la fonction. Là son rôle est un peu trop clair

Sinon tu peux aussi mettre le mdp dans un nom que tu masques avec .Visible=false.
Il n'apparaitra plus dans le gestionnaire de nom, et ta chaine sera absente du code.

Hello

Je viens de jeter un oeil a ton code, c'est assez convainquant :-). Par contre, je ne comprends pas pk il y a un @après le = dans la formule

image

A l'heure actelle, j'ai cette constante public

Option Explicit Public Const const1 = "Blablabla"

qui ensuite est utilisée pour deverouiller les feuilles ou le classeur au besoin des macro. Par exemple :

Sheets("Database").Unprotect const1

Je ne suis pas sûr de comprendre votre idée. Est ce que je dois stocké le mdp crypté dans une cellule d'une des feuilles du classeur et ensuite l'appelé dans les macro en faisant reference a cette cellule mais en décriptant au passage. Si oui, alors, je ne vois pas du tout comment coder ça :-(

eriiic en dira certainement plus et mieux...

un essai qui nécessite d'avoir le mot de passe crypté dans une cellule
Mdp = Range("B4")
Clé = "ma_clé" 'ou bien passer par une cellule
Sheets("Database").Unprotect crypterXOR(Mdp, Clé) 

j'ai tenté d'initialiser la variable Mdp directement avec la chaine du mot de passe crypté, mais comme il y a des caractères "parasites" , impossible....

Si quelqu'un arrive jusqu'à ce code, il suffit qu'il rajoute la ligne :

MsgBox crypterXOR(Mdp, Clé)

pour obtenir le mot de passe en clair.... pas facile de verrouiller

A+

Bonjour,

oui, c'est le principe.
Le stocker de façon cryptée (illisible), le décrypter à l'utilisation

Mais je viens de voir qu'il faudra que je le reprenne. La chaine est incomplète si la clé est trop courte.
Et il faudra que que je filtre les caractères se cryptant en CR ou LF ou " pour pouvoir mettre la chaine dans le code plutôt qu'une cellule.

Sinon, l'autre idée c'était de créer un nom pour stocker le mot de passe. par exemple dans 'version' pour brouiller un peu plus les pistes ;-)
Tu le masques avec :

Sub cacher_nom()
ThisWorkbook.Names("version").Visible = False
End Sub

macro que tu supprimes ensuite.

Et pour l'utiliser : MsgBox [version]
eric

Hummmmm vous m'ouvrez des horizons...

je vais me penchez la dessus

merci

j'ai corrigé le fichier mis dans le post de 17:54
Avec un exemple d'utilisation en vba
eric

PS : je n'ai pas d'@ dans la formule.
On dirait que tu as mis une plage en tableau pour qu'excel insère ce caractère

Je viens de réaliser que je n’avais pas modifier ma version de Excel ( on vient de me passer sous 365) et il semblerait que ce soit mon Excel qui fait la conversion...

Merci pour l’adaptation, je regarde ça et te redis

PS : je n'ai pas d'@ dans la formule.

On dirait que tu as mis une plage en tableau pour qu'excel insère ce caractère

Opérateur d’intersection implicite : @

L’opérateur d’intersection implicite a été introduit dans le cadre de la mise à niveau importante du langage de formule d’Excel pour prendre en charge les tableaux dynamiques. Les tableaux dynamiques apportent de nouvelles fonctionnalités de calcul et fonctionnalités significatives à Excel.

Langage de formule mis à niveau

Le langage de formule mis à niveau d’Excel est presque identique à l’ancien langage, excepté qu’il utilise l’opérateur @ pour indiquer l’endroit où une intersection implicite peut se produire, alors que l’ancien langage le faisait en silence. Par conséquent, il est possible que @ apparaisse dans des formules qui s’ouvrent dans un tableau dynamique Excel. Il est important de noter que vos formules continuent de fonctionner de la même manière que pour elles.

Qu’est-ce qu’une intersection implicite ?

La logique d’intersection implicite réduit de nombreux valeurs en une valeur unique. Excel s’est appliqué de façon à ce que la formule renvoie une valeur unique, car une cellule ne peut contenir qu’une seule valeur. Si votre formule renvoie une valeur unique, l’intersection implicite ne s’est produite qu’une seule fois. La logique fonctionne comme suit :

  • Si la valeur est un élément unique, renvoyez l’élément.
  • Si la valeur est une plage, renvoyer la valeur de la cellule sur la même ligne ou colonne que la formule.
  • Si la valeur est un tableau, sélectionnez la valeur supérieure gauche.

Lorsque vous venez de disposer de tableaux dynamiques, Excel ne limite plus le retour de valeurs uniques à partir de formules, de sorte que l’intersection implicite silencieuse n’est plus nécessaire. Dans le cas où une ancienne formule risque de déclencher une intersection implicite, le tableau dynamique activé d’Excel indique où il s’est produit avec le symbole @.

Pourquoi le symbole @ ?

Le symbole @ est déjà utilisé dans les références de table pour indiquer une intersection implicite. Prenez en considération la formule suivante dans une table = [@Column1]. Dans cet exemple, @ indique que la formule doit utiliser une intersection implicite pour récupérer la valeur sur la même ligne de [Colonne1].

Pouvez-vous supprimer le @ ?

C’est souvent. Tout dépend de la partie de la formule à droite du caractère @ renvoyé :

  • S’il renvoie une valeur unique (le cas le plus courant), il n’y a aucune modification en supprimant le signe @.
  • S’il renvoie une plage ou une matrice, le fait de supprimerle @ entraînera son détournement vers les cellules voisines.

Si vous supprimez un @ ajouté automatiquement et rouvrez le classeur dans une version antérieure d’Excel, il s’affichera sous la forme d’une formule de tableau héritée (encapsulée avec accolades {}), c’est fait pour vérifier que l’ancienne version ne déclenche pas d’intersection implicite.

Quand ajouter des formules @ à d’anciennes formules ?

En règle générale, les fonctions qui renvoient des plages ou des matrices à plusieurs cellules seront préfixées par @ si elles ont été créées dans une version antérieure d’Excel. Il est important de noter qu’il n’y a aucune modification quant à la façon dont votre formule se comporte, vous pouvez simplement voir l’intersection implicite précédemment invisible maintenant. Les fonctions courantes qui peuvent renvoyer des plages de cellules multiples incluent les fonctions INDEX, décalage et fonction définie par l’utilisateur. Il s’agit d’une exception courante, si elles sont encapsulées dans une fonction qui accepte un tableau ou une plage (par exemple, SUM () ou AVERage ()).

Pour plus d’informations, voir fonctions Excel qui renvoient des plages ou des matrices .

Exemples

Formule d’origine

Comme indiqué dans la matrice dynamique Excel

Explication

= SOMME (A1 : A10)

= SOMME (A1 : A10)

Aucune modification-aucune intersection implicite ne peut se produire, car la fonction somme attend des plages ou des matrices.

= A1 + a2

= A1 + a2

Aucune modification-aucune intersection implicite ne peut se produire.

= A1 : A10

= @A1 : A10

Une intersection implicite se produira et Excel renverra la valeur associée à la ligne dans laquelle se trouve la formule.

= INDEX (A1 : A10 ; B1)

= @INDEX (A1 : A10 ; B1)

Une intersection implicite peut se produire. La fonction index peut renvoyer une matrice ou une plage lorsque le deuxième ou le troisième argument est 0.

= DECALER (A1 : A2 ; 1 ; 1)

= @OFFSET (A1 : A2 ; 1 ; 1)

Une intersection implicite peut se produire. La fonction DECALER peut retourner une plage de plusieurs cellules. Lorsque c’est le cas, l’intersection implicite est déclenchée.

= MYUDF ()

= @MYUDF ()

Une intersection implicite peut se produire. Les fonctions définies par l’utilisateur peuvent renvoyer des tableaux. Lorsque c’est le cas, la formule d’origine aurait déclenché une intersection implicite.

Utilisation de l’opérateur @ dans de nouvelles formules

Si vous créez ou modifiez une formule dans un tableau dynamique Excel contenant l’opérateur @, il est possible qu’elle apparaisse en tant que _xlfn. SIMPLE () dans la version de tableau prédynamique d’Excel.

Cela se produit lorsque vous validez une formule mixte. Une formule mixte est une formule qui repose sur le calcul de la matrice et l’intersection implicite, elle n’est pas prise en charge par l’ensemble de calculs Excel. Les matrices de tableaux prédéfinis ne prenaient pasen charge les formules de calcul d’intersection ou IIimplicites.

Lorsque la matrice dynamique activée par Excel détecte la création d’une « formule mixte », elle propose une variante de la formule qui permet d’effectuer une intersection implicite. Par exemple, si vous entrez = a1 : a10 + @A1 : A10, la boîte de dialogue suivante s’affichera :

Une boîte de dialogue vous demandant si vous préférez plutôt le Fromula A1 a10 A1 A10.

Si vous avez choisi de rejeter la formule proposée par la boîte de dialogue, la formule mixte = a1 : a10 + @A1 : a10 sera validée. Par la suite, si vous ouvrez cette formule dans la version prédéfinie d’Excel, celle-ci s’affichera comme suit = a1 : a10 + _xlfn. SIMPLE (a1 : a10) avec la mention @ dans la formule mixte qui s’affiche en tant que _xlfn. SIMPLE (). Lorsque cette formule est évaluée par une table prédynamique Excel, elle renvoie une #NAME. valeur d’erreur.

Re

Dans ton code, quand tu déclare tes variable sur la fonction crypterXOR, tu as mis

    Dim ch2 As String, i As Long, j As Long
    Dim cCrypt As Long, nonCrypt, nc$

Je suis débutant en Vba (même si j'ai beaucoup progresser en 1 an) et je ne comprends pas pourquoi les variable nonCrypt et nc$ n'ont pas de type. Quel est l'interet de faire ça?

Aussi, je note que dans ton code, tu n'utilise pas nc$ mais nc comme variable. que signifie ce $ (je sens que c'(est une question de débutant ...)?

Bonne journée

Bastien

C'est trop génial, ça marche :-)

Une petite obfuscation la dessus et ça devient encore plus complexe a décripter ...

Pourrais tu me confirmer que je peux changer le nom de la macro dans son entier ou faut-il conserver le XOR?

Bonjour,

merci pour la doc sur @

Je pensais t'avoir répondu... mais non.
nonCrypt va recevoir un tableau et doit être Variant. C'est le type par défaut.
Pour nc$ c'est le suffixe $ qui le type en Texte. Dans le temps c''est la seule façon de typer en basic.

D'habitude j'essaie de typer de façon explicite.
Là, ça me gênait de laisser ces petits dysfonctionnements et ajouté rapidement ces variables, oubliant de mettre en plus lisible ensuite.

Tu peux mettre ceinture et bretelle en mettant le mdp crypté dans un nom masqué.
Par contre l'obfuscation ne participe en rien à masquer ton mot de passe...
A mon avis tu vas te compliquer la vie avec ça, et abandonner rapidement car ça sera à refaire à chaque modif.

Tu peux tout changer, pour le nom de la fonction dans la limite de ce qui est autorisé.
Un petit test te donnait la réponse
eric

Hello

merci pour les explications.

nonCrypt va recevoir un tableau et doit être Variant. C'est le type par défaut.

Pour nc$ c'est le suffixe $ qui le type en Texte. Dans le temps c''est la seule façon de typer en basic.

D'habitude j'essaie de typer de façon explicite.

Là, ça me gênait de laisser ces petits dysfonctionnements et ajouté rapidement ces variables, oubliant de mettre en plus lisible ensuite.

Donc si je voulais être extrémiste du code, il faudrait déclarer nonCrypt as Variant nc as String.Est ce correct (c'est plus pour moi, pour être sur d'avoir compris ?

Tu peux mettre ceinture et bretelle en mettant le mdp crypté dans un nom masqué.

Je pensais que j'avais compris sur le coup, mais à la relecture, je crois que je n’ai pas compris ton idée :-(. J'ai encrypté l'id et le mdp dans une cellule que j'ai masqué en mettant le Font en blanc. Du coup ça donne qqch du style :

ActiveWorkbook.Protect crypterXOR((Sheets("Activation_Macro").Range("EI12").Value), (Sheets("Home").Range("B25")))

et c'est pour ça que je voulais obfusquer pour brouiller les pistes. ça donne ça du coup après obfuscation, ce qui est plus dur à décrypter.

ActiveWorkbook.Protect crypterXOR((Sheets(Chr(65) & Chr(99) & Chr(116) & Chr(105) & Chr(118) & Chr(97) & Chr(116) & Chr(105) & Chr(111) & Chr(110) & Chr(95) & Chr(77) & Chr(97) & Chr(99) & Chr(114) & Chr(111)).Range(Chr(69) & Chr(73) & Chr(49) & Chr(50)).Value), (Sheets(Chr(72) & Chr(111) & Chr(109) & Chr(101)).Range(Chr(66) & Chr(50) & Chr(53))))

Mais du coup, sans réellement avoir compris ton idée, je me rends compte que ce n'était pas ça ton idée. Pourrais-tu m'éclairer sur ce que tu entends par "crypté dans un nom masqué".

Encore merci pour votre aide

Bastien

ps : En ce qui me concerne, l'obfuscation n'est pas réellement un problème en cas de modif, car je garde toujours une copie du fichier en clair et j'ai un utilitaire qui permet d'obfusquer les macro en sauvegardant la macro initiale dans un .txt. Donc,k je peux toujours la c/c et la retravailler avant de la re-obfusquer.

Rechercher des sujets similaires à "constantes public mdp"