Page 1 sur 1

Proteger son programme avec un mot de passe

Publié : jeu. 27/mai/2004 9:06
par Heero
voila je met ici un truc que j'ai decouvert (même si la plupart de vous sont capable d'en faire un sans probleme) pour les debutant qui souhaiterai proteger leur programme avec un mot de passe .je ne sais pas ce que vaut ce code mais je pense qu'il est suffisant pour ce proteger d'un petit frere ou de ses parents ayant des connaissances limité en informatique

Code : Tout sélectionner

Procedure Ouvrir()
    If OpenWindow(0, 0, 0, 325, 100,#PB_Window_ScreenCentered, "Mot de Passe")  
        If CreateGadgetList(WindowID())
            TextGadget(1,78,10,165,20, "Veuillez inserer votre Mot de Passe")
            StringGadget(2,40,35,245, 20, "", #PB_String_Password)
            ButtonGadget(3, 30, 67, 60, 22, "OK")
            ButtonGadget(4, 235, 67, 60, 22, "Annuler")
        EndIf 
        AddKeyboardShortcut(0, #PB_Shortcut_return, 3) ;sert a ce que l'on puisse appuyer sur entrer pour valider le code
    EndIf
EndProcedure    
  
Ouvrir()
  ActivateGadget(2) ; pour que des l'ouverture du programme vous puissiez ecrire sans devoir cliquer sur le stringGadget
  
    Repeat 
        Event = WaitWindowEvent() 
        If Event = #PB_EventCloseWindow 
            Quit = 1 
        EndIf
        
    Select EventGadgetID()
        
        Case 3 
            MDP$ = GetGadgetText(2)  ; obtiens les infos sur le stringGadget 
            If MDP$ = "votre_mot_de_passe" 
               
            EndIf
            If MDP$ <> "votre_mot_de_passe"
               End 
            EndIf 
            
        Case 4
            End 
            
    EndSelect
   
    Until Quit
si vous pensez qu'il peut etre ameliorer ou que les explications ne sont pas assez claire dite le

Publié : jeu. 27/mai/2004 14:51
par Guimauve
Moi je ferais plutôt comme ceci :

Code : Tout sélectionner

Procedure Password()
#PasswordWindow = 0
#Texte = 1
#Mot_de_passe_entree = 2
#Btn_OK = 3
#Btn_Cancel = 4


     If OpenWindow(#PasswordWindow, 0, 0, 325, 100, #PB_Window_SystemMenu | #PB_Window_ScreenCentered, "Mot de Passe")
          If CreateGadgetList(WindowID(#PasswordWindow))
               TextGadget(1, 78, 10, 165, 20, "Veuillez inserer votre Mot de Passe")
               StringGadget(2, 40, 35, 245, 20, "", #PB_String_Password)
               ButtonGadget(#Btn_OK, 30, 67, 60, 22, "OK")
               ButtonGadget(#Btn_Cancel, 235, 67, 60, 22, "Annuler")
          EndIf
          AddKeyboardShortcut(#PasswordWindow, #PB_Shortcut_return, #Btn_OK) ; sert a ce que l'on puisse appuyer sur entrer pour valider le code
     EndIf
     
     ActivateGadget(#Mot_de_passe_entree) ; pour que des l'ouverture du programme vous puissiez ecrire sans devoir cliquer sur le stringGadget
     
     Repeat
          Event = WaitWindowEvent()
          
          Select EventGadgetID()
                    
               Case #Btn_OK
                    MDP$ = GetGadgetText(2) ; obtiens les infos sur le stringGadget
                    If MDP$ = "Mot de passe"
                         MessageRequester("Bienvenu", "Vous êtes un utilisateur reconnu")
                         user = #True
                         Event = #PB_EventCloseWindow
                    Else
                         user = #False
                         Event = #PB_EventCloseWindow
                    EndIf
                    
               Case #Btn_Cancel
                    user = #False
                    Event = #PB_EventCloseWindow
                    
          EndSelect
          
     Until Event = #PB_EventCloseWindow
     
     ; On ferme la Fenètre de demande de mot de passe
     CloseWindow(#PasswordWindow)
     
     ProcedureReturn user
EndProcedure



; *************************************************************************************
; Au début de votre programme

utilisateurautorise = Password()

If utilisateurautorise = #False
     ; L'Utilisateur n'est pas autorisé à utiliser le programme.
     ; On ferme le programme
     End
Else
     ; L'utilisateur est autorisé, on ouvre la fenètre ...

     If OpenWindow(0, 0, 0, 322, 150, #PB_Window_SystemMenu | #PB_Window_ScreenCentered, "EditorGadget")
          If CreateGadgetList(WindowID(0))
               EditorGadget (0, 8, 8, 306, 133, #PB_Container_Raised)
               For a = 0 To 5
                    AddGadgetItem(0, a, "Line " + Str(a))
               Next
          EndIf
     EndIf
     
     Repeat : Until WaitWindowEvent() = #PB_Event_CloseWindow
     
EndIf
Une autre petite chose, il faudrait ajouter une petite gestion en cas d'erreur d'entrée du mot de passe (si après 3 essais le mot de passe n'est pas bon on ferme le programme) et peut-être ajouter la sélection d'un nom d'utilisateur.

A+
Guimauve

Publié : jeu. 27/mai/2004 18:09
par Heero
ui je sui d'accord avec toi pour le ajout d'un nom d'utilisateur et que au bout de trois erreur ça quite le programme mais je sais pas faire .
puis tu dis que toi tu le ferai comme ça esque ,le mot de passe est mieu proteger ou y'a un truc dans ce style la qui est mieu que dans le mien ?
puis une derniere question je n'ai pas tres bien compris l'utilité de "esle"
et des "procedurereturn" pouvez vous m'expliquer ?

Publié : jeu. 27/mai/2004 19:15
par Keph
Crypte ton mot de passe avec md5(), sinon il sera facile de le retrouver avec un désassembleur.

Publié : jeu. 27/mai/2004 19:42
par Heero
je veux bien mais je sais pas faire, il faut que je regarde
c'est compliqué ou relativement facile a comprendre ?

Publié : jeu. 27/mai/2004 21:01
par Keph
Essaie, tu verras bien. Lance toi.

Publié : ven. 28/mai/2004 7:08
par Guimauve
Heero a écrit :puis tu dis que toi tu le ferai comme ça esque ,le mot de passe est mieu proteger ou y'a un truc dans ce style la qui est mieu que dans le mien ?
puis une derniere question je n'ai pas tres bien compris l'utilité de "esle"
et des "procedurereturn" pouvez vous m'expliquer ?
Pour ta première question et bien tu semble être débutant. Quand on fait de la programmation, on essai de faire une routine d'une telle manière pour qu'il soit possible de la réutiliser plus tard dans un autre programme.
Un petit truc à moi, les instruction pour arrèter le programme, j'essais autant que possible de les placer dans le source principale et non dans les procédures, c'est plus facile à gérer surtout s'il y a plusieurs procédures qui peuvent arrèter le programme.

Donc on code une routine et on l'appelle. Sur un petit programme c'est pas vraiment nécessaire mais c'est mieux de prendre une bonne habitude dès le départ et de programmer structuré.

Pour ta deuxième question, le Else n'est pas vraiment utile, c'est une touche personnel, tu es libre de l'utilise ou non.

Pour les ProcedureReturn, comment t'expliquer ... tu sais que lorsque tu demande un mot de passe, il y a que 2 choix possibles, OUI l'utilisateur est autorisé ou NON il n'est pas autorisé. Donc la procédure va simplement dire au programme principal si OUI ou NON il doit continuer.

Pour faire comme Keph, tu pourrais créer une clé cripté et donner le nom du fichier à la procédure Password (Comme ceci : Password(fichier_cripte_liste_utilisateur.s))qui décripter la clé et comparer les entrées avec les données de la clé. Puis signaler au programme principal si OUI ou NON l'utilisateur peut continuer.

Essais de le coder toi même et si tu as des questions ne te gène pas, le forum est là pour ça.

Bonne chance

A+
Guimauve

Publié : ven. 28/mai/2004 12:07
par Heero
oui je suis un debutant je me suis mis y'a pas longtemp sur purebasic et il se trouve que au debut c'est un peu dure a trouvé les fonctions et tous mais bon il faut apprendre

Publié : sam. 29/mai/2004 7:19
par Guimauve
Et voilà un prototype : (J'ai repris un code sur code archive : Grand merci à l'auteur.)

Code : Tout sélectionner

Procedure.s Crypter(String$, Action.b)
     
     If Action = 0 ; On code la chaine
          von.w = 97
          zu.w = 127
          For a = 0 To 25
               If a = 18 ; schließe diese beiden Zeichen aus (´=145) (´=146)  (s t)
                    a = a + 2 ; siehe  Tools `ASCII Table´
               EndIf
               von$ = Chr(von.w + a)
               zu$ = Chr(zu.w + a)
               String$ = ReplaceString(String$, von$, zu$)
          Next a
          ProcedureReturn String$
          
     ElseIf Action = 1 ; On décode la chaine
          von.w = 127
          zu.w = 97
          For a = 0 To 25
               If a = 18
                    a = a + 2
               EndIf
               von$ = Chr(von.w + a)
               zu$ = Chr(zu.w + a)
               String$ = ReplaceString(String$, von$, zu$)
          Next a
          ProcedureReturn String$
     EndIf
EndProcedure


; •/•/•/•/•/•/•/•/•/•/•/•/•/•/•/•/•/•/•/•/•/•/•/•/•/•/•/•/•/•/•/•/•/•/•/•/•/•/•/•/•/•/•/•/•/•/•/•/•/•/•/•/•/
; Le code qui suit doit être mis en commentaire pour créer le programme final
; Il sert juste à générer la clef 
; •/•/•/•/•/•/•/•/•/•/•/•/•/•/•/•/•/•/•/•/•/•/•/•/•/•/•/•/•/•/•/•/•/•/•/•/•/•/•/•/•/•/•/•/•/•/•/•/•/•/•/•/•/
; 
; Dim Utilisateur.s(1)
; 
;  Utilisateur(0)= "Heero ? Mot de passe"
;  Utilisateur(1)= "User2 ? Allo"
; 
;  ; Si le fichier Français n'existe pas créer le fichier français
;  If FileSize("Clef.txt") = -1
;  OpenFile(0, "Clef.txt")
;  For texte = 0 To 1
;  WriteStringN(Crypter(Utilisateur(texte),0))
;  Next
;  CloseFile(0)
;  EndIf
; •/•/•/•/•/•/•/•/•/•/•/•/•/•/•/•/•/•/•/•/•/•/•/•/•/•/•/•/•/•/•/•/•/•/•/•/•/•/•/•/•/•/•/•/•/•/•/•/•/•/•/•/•/

Procedure Password(Nomfichier$)
     
     Enumeration
          #PasswordWindow
          #Texte_Utilisateur
          #ComboBox_Utilisateur
          #Texte_Mot_de_passe
          #Mot_de_passe_entree
          #Btn_OK
          #Btn_Cancel
          #Fichier_clef
     EndEnumeration
     
     #Nb_max_user = 10
     
     Dim ListeUser.s(#Nb_max_user)
     
     ; Chargement des textes pour le programme
     If OpenFile(#Fichier_clef, Nomfichier$)
          Repeat
               texte$ = ReadString()
               If Left(texte$, 1) <> ";" ; On traite les lignes de commentaire
                    If texte$ <> "" ; On traite les lignes vide
                         ListeUser(n) = Crypter(texte$, 1)
                         ; Debug ListeUser(n)
                    EndIf
               EndIf
               n + 1
          Until Eof(#Fichier_clef)
          CloseFile(#Fichier_clef)
     EndIf
     
     If OpenWindow(#PasswordWindow, 0, 0, 325, 150, #PB_Window_SystemMenu | #PB_Window_ScreenCentered, "Mot de Passe")
          If CreateGadgetList(WindowID(#PasswordWindow))
               TextGadget(#Texte_Utilisateur, 0, 10, WindowWidth(), 20, "Veuillez choisir votre nom d'utilisateur", #PB_Text_Center)
               ComboBoxGadget(#ComboBox_Utilisateur, 40, 30, 245, 100)
               TextGadget(#Texte_Mot_de_passe, 0, 65, WindowWidth(), 20, "Veuillez inserer votre Mot de Passe", #PB_Text_Center)
               StringGadget(#Mot_de_passe_entree, 40, 85, 245, 20, "", #PB_String_Password)
               ButtonGadget(#Btn_OK, 30, 120, 60, 22, "OK")
               ButtonGadget(#Btn_Cancel, 235, 120, 60, 22, "Annuler")
          EndIf
          AddKeyboardShortcut(#PasswordWindow, #PB_Shortcut_return, #Btn_OK) ; sert a ce que l'on puisse appuyer sur entrer pour valider le code
     EndIf
     
     ; Ici on met en place la liste des utilisateurs
     For userno = 0 To n
          AddGadgetItem(#ComboBox_Utilisateur, -1, RTrim(LTrim(StringField(ListeUser(userno), 1, "?"))) )
     Next
     
     SetGadgetState(#ComboBox_Utilisateur, 0) ; pour que dès l'ouverture du programme le premier nom de la liste soit affiché dans la combobox.
     ActivateGadget(#Mot_de_passe_entree) ; pour que dès l'ouverture du programme vous puissiez ecrire sans devoir cliquer sur le stringGadget
     
     Repeat
          Event = WaitWindowEvent()
          
          Select EventGadgetID()
                    
               Case #Btn_OK
                    Username$ = GetGadgetText(#ComboBox_Utilisateur)
                    Password$ = GetGadgetText(#Mot_de_passe_entree)
                    ; Ici on reconstruit la chaine comme dans la clef
                    User$ = Username$ + " ? " + Password$
                    
                    For x = 0 To n
                         trouver = FindString(ListeUser(x), User$, 1)
                         If trouver = 1
                              Break
                         EndIf
                    Next
                    
                    If trouver = 1
                         MessageRequester("Bienvenu", "Bonjour à toi " + Username$ + ".")
                         user = #True
                         Event = #PB_EventCloseWindow
                    Else
                         
                         If essai < 2 ; Essai est la variable de contôle du nombre de fois qui est permit de se tromper
                              MessageRequester("Erreur !!", "Veuiller sélectionner le bon nom d'utilisateur" + Chr(10) + "ou entrer votre mot de passe à nouveau.")
                              SetGadgetText(#Mot_de_passe_entree, "")
                              ActivateGadget(#Mot_de_passe_entree)
                              essai + 1
                         Else
                              user = #False
                              Event = #PB_EventCloseWindow
                         EndIf
                    EndIf
                    
               Case #Btn_Cancel
                    user = #False
                    Event = #PB_EventCloseWindow
                    
          EndSelect
          
     Until Event = #PB_EventCloseWindow
     
     ; On ferme la Fenètre de demande de mot de passe
     CloseWindow(#PasswordWindow)
     
     ProcedureReturn user
EndProcedure




; *************************************************************************************
; *************************************************************************************
; *************************************************************************************

utilisateurautorise = Password("Clef.txt")

If utilisateurautorise = #False
     End
Else
     
     If OpenWindow(0, 0, 0, 322, 150, #PB_Window_SystemMenu | #PB_Window_ScreenCentered, "EditorGadget")
          If CreateGadgetList(WindowID(0))
               EditorGadget (0, 8, 8, 306, 133, #PB_Container_Raised)
               For a = 0 To 5
                    AddGadgetItem(0, a, "Line " + Str(a))
               Next
          EndIf
     EndIf
     
     Repeat : Until WaitWindowEvent() = #PB_Event_CloseWindow
     
EndIf
La clef n'est pas crypter mais coder elle peut être décoder mais pour une protection légère ça peut faire l'affaire.

A+
Guimauve

Publié : sam. 29/mai/2004 9:37
par Heero
OK je vais y jeter un coup d'oeil pour essayer de le comprendre
MERCI