Générateur de mot de passe

Soyez le premier à donner votre avis sur cette source.

Vue 23 385 fois - Téléchargée 2 570 fois

Description

--> Générateur de mots de passes
--------------------------------

Cette application permet de générer des mots de passe de
manière aléatoire avec ou sans contraintes.

Pour être clair, il s'agit d'une application pour ceux qui
sont à cours d'idées pour imaginer leurs nouveaux mots de
passe, et non d'un outil pour crackers..

Je ne porte aucune responsabilité sur les conséquences de
l'utilisation de cette application.

Le but est d'illustrer plusieurs principes de programmation
en Delphi, dont:

- l'utilisation du générateur de nombres aléatoires
- la conversion de nombres en chaînes et inversement
- la copie dans le presse-papiers de Windows

--> Olivier

Source / Exemple :


unit Unit1;

{
Générateur de mot de passe.
Olivier - Juillet 2006
Ce petit programme est réalisé dans le cadre d'un exercice de programmation
en Delphi.
Il illustre l'emploi du générateur aléatoire, de manipulation de chaînes
de caractères, de combinaison de condition logiques, etc.
}

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  StdCtrls, ComCtrls, IniFiles, Menus, ExtCtrls, jpeg;

type
  TForm1 = class(TForm)
	 GroupBox1: TGroupBox;
	 ChkMin: TCheckBox;
	 ChkMaj: TCheckBox;
	 ChkChiffres: TCheckBox;
	 Label1: TLabel;
	 EdNombre: TEdit;
	 UpDown1: TUpDown;
	 Label2: TLabel;
	 EdPrefixe: TEdit;
	 BtnGenerer: TButton;
	 EdMdP: TEdit;
	 BtnCopier: TButton;
	 Label4: TLabel;
	 MainMenu1: TMainMenu;
	 Fichier1: TMenuItem;
	 Quitter1: TMenuItem;
	 Edition1: TMenuItem;
	 Copier: TMenuItem;
	 BtnEnr: TButton;
	 Label3: TLabel;
	 Enregistrer1: TMenuItem;
	 N1: TMenuItem;
	 SaveDialog1: TSaveDialog;
	 ChkNoRepet: TCheckBox;
    Aide1: TMenuItem;
    Apropos1: TMenuItem;
    ImgLogo1: TImage;
	 procedure BtnGenererClick(Sender: TObject);
	 procedure FormCreate(Sender: TObject);
	 procedure BtnCopierClick(Sender: TObject);
	 procedure EdMdPChange(Sender: TObject);
	 procedure Quitter1Click(Sender: TObject);
	 procedure Enregistrer1Click(Sender: TObject);
	 procedure FormCloseQuery(Sender: TObject; var CanClose: Boolean);
    procedure Apropos1Click(Sender: TObject);
  private
	 { Déclarations privées }
  public
	 { Déclarations publiques }
  end;

var
  Form1: TForm1;
  INI: TIniFile;

implementation

{$R *.DFM}

procedure TForm1.FormCreate(Sender: TObject);
begin
	{ouverture du programme}
	{lecture des paramètres (s'il y en a)
	On ouvre un fichier de même nom que l'application, mais d'extension .ini
	S'il n'existe pas, il est ignoré et les options auront
	des valeurs par défaut}
	Ini := TIniFile.Create(ChangeFileExt(Application.ExeName, '.ini'));
	ChkMaj.Checked := Ini.ReadBool('Options','Maj', False);
	ChkMin.Checked := Ini.ReadBool('Options','Min', True);
	ChkChiffres.Checked := Ini.ReadBool('Options','Chiffres', True);
	ChkNoRepet.Checked := Ini.ReadBool('Options','NoRepet', False);
	UpDown1.Position := Ini.ReadInteger('Options','Nombre', 6);
	EdPrefixe.Text := Ini.ReadString('Options','Prefixe', '');
	SaveDialog1.FileName := Ini.ReadString('Options','Fichier', '');
	Ini.Free;	{fermeture du fichier INI}
	Randomize; // Réinitialisation de la suite pseudo-aléatoire
end;

procedure TForm1.BtnGenererClick(Sender: TObject);
{Cette procédure est exécutée par un clic sur le bouton Générer}
const
	TabCarNum = '0123456789';                    // tous les chiffres
	TabCarMin = 'abcdefghijklmnopqrstuvwxyz';    // toutes les lettres minuscules
	TabCarmaj = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ';    // toutes les lettres majuscules
var
	Ch: Char;
	S: string;
	i, n, l : integer;
begin
	{au départ, on recopie le préfixe obligatoire dans le champ texte
	 qui reçoit le mot de passe}
	EdMdP.Text := EdPrefixe.Text;
	n := 0;
	if UpDown1.Position > 0 then
		{le nombre de caractères requis est indiqué dans le contrôle UpDown}
		n := UpDown1.Position;
	{S est la chaîne de caractères dans laquelle le tirage sera fait
	Elle est constituée d'une suite de chiffres, de majuscules et de
	minuscules, selon les options choisies}
	S := '';
	if ChkChiffres.Checked then
		S := S + TabCarNum;
	if ChkMin.Checked then
		S := S + TabCarMin;
	if ChkMaj.Checked then
		S := S + TabCarMaj;
	l := Length(S);  {longueur de S, pour plage du choix aléatoire}
	if l = 0 then begin
		MessageDlg('Veuillez choisir des chiffres et/ou des lettres',
     mtInformation, [mbOK], 0);
		exit;
	end;
	{on éxécute la boucle de choix aléatoire jusqu'à ce que le champ
	texte du mot de passe contienne le nombre de caractères voulu}
	while Length(EdMdP.Text) < n do begin
		{On choisit un chiffre entre 1 et la longueur de S}
		i := Round(Random(l+1));
		{On récupère le caractère situé à cette position dans S}
		Ch := S[i];
		if ChkNoRepet.Checked and (n < l) then begin
			{Si on interdit la répétition, il faut refaire le choix
			 tant que Ch figure déjà dans le mot de passe.
			 ATTENTION: cela n'est logique que si le nombre de caractères
			 demandé pour le mot de passe (n) est inférieur au nombre
			 de caractères constituant S (l); dans le cas contraire,
			 cette option est sans effet}
			while Pos(Ch, EdMdp.Text) > 0 do begin
				i := Round(Random(l+1));
				Ch := S[i];
			end;
		end;
		{enfin, on ajoute le caractère aléatoire directement dans le
		champ de texte recevant le mot de passe}
		EdMdP.Text := EdMdP.Text + Ch;
	end;
end;

procedure TForm1.EdMdPChange(Sender: TObject);
begin
	{cet événement est généré à chaque changement du contenu du champ
	texte du mot de passe. On en profite pour rendre accessibles les
	boutons et commandes de menu nécessaires à l'utilisation du résultat}
	BtnCopier.Enabled := (Length(EdMdp.Text) > 0);
	Copier.Enabled := BtnCopier.Enabled;
	Enregistrer1.Enabled := BtnCopier.Enabled;
	BtnEnr.Enabled := BtnCopier.Enabled;
end;

procedure TForm1.BtnCopierClick(Sender: TObject);
begin
	{cette commande envoye le mot de passe dans le presse-papier de Windows
	equivaut à Edition, Copier}
	if EdMdP.Text <> '' then begin
		EdMdP.SelectAll;
		EdMdP.CopyToClipboard;
		MessageDlg('Le mot de passe ci-dessus est copié dans le presse-'
		+ 'papiers. Vous pouvez le récupérer par une commande Coller '
		+ 'dans un autre logiciel', mtInformation, [mbOK], 0);
	end;
end;

procedure TForm1.Quitter1Click(Sender: TObject);
begin
	Close;
end;

procedure TForm1.Enregistrer1Click(Sender: TObject);
var
	s, nf: string;
	f: TextFile;
	bAppend: boolean;
	Delim: char;
begin
	{Pour enregistrer le mot de passe en l'associant à un utilisateur}
	s := '';
	{Afficher une boîte de dialogue pour demander un nom d'utilisateur}
	if InputQuery('Enregistrement',
	'Associer le mot de passe à l''utilisateur:', s) then begin
		{Si l'utilisateur a cliqué sur OK, on arrive ici}
		if s = '' then
			exit; {chaîne vide, non valable}
		{Demander dans que fichier (boîte de dialogue standard)}
		if SaveDialog1.Execute then begin
			if SaveDialog1.FileName = '' then exit;
			nf := SaveDialog1.FileName; {nom complet du fichier}
			{on peut choisir entre CSV et TXT}
			if LowerCase(ExtractFileExt(nf)) = '.csv' then
				{en CSV, une virgule comme délimiteur de champs}
				Delim := ','
			else
				{sinon, une tabulation}
				delim := #9;
			s := s + Delim + EdMDP.Text;
			bAppend := False;
			if FileExists(nf) then
				{si le fichier choisi existe, on ajoute l'enregistrement
				 à la suite}
				bAppend := True;
			AssignFile(F, nf);
			{$I-}
			if bAppend then
				Append(F)   {mode ajout}
			else
				Rewrite(F); {créer le fichier}
			{$I+}
			if IOResult <> 0 then begin
				MessageDlg('Impossible d''enregistrer dans le fichier '
         + nf, mtWarning, [mbOK], 0);
				exit;
			end;
			{écriture de la chaîne S dans le fichier}
			WriteLn(F, S);
			{fermeture du fichier}
			CloseFile(F);
		end;
	end;
end;

procedure TForm1.FormCloseQuery(Sender: TObject; var CanClose: Boolean);
begin
	{fermeture du programme, enregistrement des paramètres}
	Ini := TIniFile.Create(ChangeFileExt(Application.ExeName, '.ini'));
	try
	Ini.WriteBool('Options','Maj', ChkMaj.Checked);
	Ini.WriteBool('Options','Min', ChkMin.Checked);
	Ini.WriteBool('Options','Chiffres', ChkChiffres.Checked);
	Ini.WriteBool('Options','NoRepet', ChkNoRepet.Checked);
	Ini.WriteInteger('Options','Nombre', UpDown1.Position);
	Ini.WriteString('Options','Prefixe', EdPrefixe.Text);
	Ini.WriteString('Options','Fichier', SaveDialog1.FileName);
	finally
	Ini.Free;
	end;
end;

procedure TForm1.Apropos1Click(Sender: TObject);
begin
	MessageDlg
  ('Programme réalisé en Delphi 5 par Olivier - Juillet 2006'
	+ #13#10 + 'http://ami.informaticien@laposte.net' , mtInformation, [mbOK], 0);
end;
 end.

Conclusion :


Il est possible avec cette application: de générer des MDP (avec vos préférences), de le copier, de le sauver via le presse papier. Utilisation des fichiers: .ini, .local.

En esperant que ça intéressera certains. A bientôt. Olivier

Codes Sources

A voir également

Ajouter un commentaire Commentaires
cs_cantador Messages postés 4720 Date d'inscription dimanche 26 février 2006 Statut Modérateur Dernière intervention 31 juillet 2021 14
20 oct. 2006 à 19:32
il faut supprimer le dossier "ModelSupport" dans unit1

un petit soft sympa et intéressant pour illustrer
quelques fontions même si l'expérience montre
qu'en matière de mot de passe, on utilise plutôt une méthode mnémotechnique qu'une solution aléatoire.

7/10
JulioDelphi Messages postés 2226 Date d'inscription dimanche 5 octobre 2003 Statut Membre Dernière intervention 18 novembre 2010 14
19 oct. 2006 à 15:07
bien sympa, pas de bourdes comme j'aurait pu m'y attendre
sinon c'est quoi ça : "http://ami.informaticien@laposte.net" une adresse intermail ? ^^
f0xi Messages postés 4205 Date d'inscription samedi 16 octobre 2004 Statut Modérateur Dernière intervention 12 mars 2022 37
19 oct. 2006 à 14:45
juste un petit truc :


uses Math;

Ch := S[RandomRange(1,l+1)];

Random renvois un entier donc pas besoin de Round et pas besoin non plus d'une variable i pour stocker le nombre aleatoire. c'est pas vraiment utile ici.

de plus Random(l+1) renvois une valeur de 0..l+1 donc il y auras une exception si i = 0
puisqu'un string vas de 1..l, 0 etant logiquement l'octet qui sert a stocker la taille de la chaine quand on transtype en shortstring par exemple et vaut #0 dans le type string.

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.