Salut SVP je voudrais savoir comment chiffrer un mot de passe avec le compilateur Free Pascal
Salut SVP je voudrais savoir comment chiffrer un mot de passe avec le compilateur Free Pascal
Bonjour !
Cela dépend du niveau de sécurité dont vous avez besoin et de votre intérêt. Est-ce que vous voulez juste une solution qui fonctionne (quitte à ne pas savoir comment elle fonctionne), ou est-ce que vous êtes intéressé par le côté programmation ?
Personnellement j'aime bien les algorithmes les plus simples. Souvent on n'a pas vraiment besoin d'un haut niveau de sécurité, et dans ce cas il est plus amusant de bricoler quelque chose soi-même.
Bonjour,
Je répondrais comme Roland, en ajoutant ceci : "chiffrer un mot de passe" n'est pas en rapport direct avec Free Pascal, car les algorithmes utilisables sont universels et par conséquent largement indépendants du langage de programmation choisi.
On peut imaginer un codage élémentaire, du genre échanger des lettres, jusqu'à des bibliothèques complètes comme DCPCrypt
Dans le premier cas, on essaye de comprendre et d'améliorer ses connaissances, dans le second on réutilise la travail d'autrui afin de l'intégrer au sien...
En complément...
C'est vrai qu'il n'y a pas à proprement parler de fonction "EncrypterMotDePasse" dans Free Pascal. Mais il est cependant très facile d'implémenter des choses simples (pour vraiment un minimum de sécurité).
Tout d'abord quelques fondamentaux (au cas où):
- pour des raisons de sécurité, on ne crypte d'habitude pas un mot de passe (en tous les cas, pas si le but est juste de le vérifier ensuite). On "hash" (cf. https://fr.wikipedia.org/wiki/Fonction_de_hachage) ce mot de passe, puis on stocke le hash ainsi obtenu,
- ensuite, lorsque l'on doit vérifier le mot de passe, on hash également le mot de passe entré par l'utilisateur, et on vérifie que le hash nouvellement obtenu est bien identique à celui stocké,
- pour éviter de pouvoir casser trop rapidement les mots de passe stockés, on utilise additionnellement un "salt" (cf. https://fr.wikipedia.org/wiki/Salage...yptographie%29), ainsi éventuellement que des fonctions additionnelles de transformation.
Il est donc possible de réaliser facilement ces opérations avec des fonctions de base; en sachant cependant que cela ne fournit qu'une protection minimale (mais c'est en tous les cas mieux que de stocker directement le mot de passe encrypté).
Pour une "réelle" protection, il faut utiliser des algorithmes spécifiques (mais qui à la base utilisent toujours les concepts fondamentaux ci-avant). Par exemple:
- PBKDF2: https://fr.wikipedia.org/wiki/PBKDF2,
- Bcrypt: https://en.wikipedia.org/wiki/Bcrypt
- ou mieux Scrypt: https://fr.wikipedia.org/wiki/Scrypt.
Pour résumer:
- pour un minimum de sécurité (il faut bien comprendre que c'est vraiment un "minimum") et pour des questions de facilité, on peut utiliser une fonction de hash standard sur un mot de passe + un salage. Par défaut, Free Pascal intègre les fonctions de hash MD5 et SHA1 (qui ne se sont plus considérées comme étant sécurisées). Le résultat obtenu peut ensuite être stocké/utilisé par exemple avec des fonctions d'encodage en base64 (en standard aussi dans Free Pascal), pour une meilleure facilité d'utilisation (le résultat n'étant pas directement une chaîne de caractères, mais du binaire).
- pour faire les choses "dans l'état de l'art" (et bien que je persiste à penser que c'est une sécurité plutôt "illusoire" dans le cas de programmes classiques pour ordinateur), il faut utiliser des fonctions issues d'algorithmes dédiés. On trouve des bibliothèques de base pour cela, comme DCPCrypt (http://wiki.freepascal.org/DCPcrypt). Et voici un exemple de mise en application (non testé): http://keit.co/p/dcpcrypt-hmac-rfc2104/
Il existe aussi des implémentations de Bcrypt et Scrypt pour Delphi et plus précisément:
- https://github.com/JoseJimeniz/bcrypt-for-delphi
- https://github.com/JoseJimeniz/scrypt-for-delphi
mais je ne sais pas si elles fonctionnent aussi avec Free Pascal.
A voir aussi: http://www.wolfgang-ehrhardt.de/crypt_en.html
En attendant mieux, voici une très simple unité que j'ai faite. Je vous laisse juge de ses avantages et de ses inconvénients.
Le principe est d'avoir une table qui à chaque ansichar associe un autre ansichar, avec une autre table qui contient l'association réciproque :
Là-dessus j'ai deux fonctions de chiffrage et de déchiffrage qui substituent les caractères d'une chaîne conformément aux tables :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37 const T1: array[ansichar]of ansichar = #229#117#013#064#153#010#040#190#231#151#065#062#052#043#122#239+ #198#074#048#069#018#169#123#011#217#189#174#058#004#203#147#035+ #224#096#001#138#183#157#163#161#076#078#126#113#158#028#253#075+ #108#234#095#238#026#084#012#170#218#093#092#167#168#027#118#140+ #006#237#241#136#005#244#091#132#047#129#044#131#225#155#086#145+ #107#184#207#114#089#051#142#097#210#083#021#213#109#099#206#139+ #141#063#055#245#110#120#046#085#193#164#090#208#201#133#059#053+ #060#134#181#219#007#009#228#182#188#135#105#003#196#222#179#016+ #112#178#205#127#230#254#025#195#116#232#149#125#137#019#236#067+ #002#177#039#098#033#102#087#240#032#211#150#199#038#172#024#197+ #202#072#056#216#191#194#242#243#246#045#166#057#251#020#022#081+ #121#042#101#160#088#015#119#041#175#111#023#162#185#030#104#200+ #180#037#154#017#082#187#171#212#094#250#070#029#050#146#100#066+ #192#220#106#079#226#124#077#128#173#255#221#148#068#073#176#249+ #103#036#130#215#049#014#227#144#165#235#152#223#247#071#115#186+ #034#252#080#000#143#156#233#159#061#248#204#054#214#209#031#008; T2: array[ansichar]of ansichar = #243#034#144#123#028#068#064#116#255#117#005#023#054#002#229#181+ #127#195#020#141#173#090#174#186#158#134#052#061#045#203#189#254+ #152#148#240#031#225#193#156#146#006#183#177#013#074#169#102#072+ #018#228#204#085#012#111#251#098#162#171#027#110#112#248#011#097+ #003#010#207#143#220#019#202#237#161#221#017#047#040#214#041#211+ #242#175#196#089#053#103#078#150#180#084#106#070#058#057#200#050+ #033#087#147#093#206#178#149#224#190#122#210#080#048#092#100#185+ #128#043#083#238#136#001#062#182#101#176#014#022#213#139#042#131+ #215#073#226#075#071#109#113#121#067#140#035#095#063#096#086#244+ #231#079#205#030#219#138#154#009#234#004#194#077#245#037#044#247+ #179#039#187#038#105#232#170#059#060#021#055#198#157#216#026#184+ #222#145#129#126#192#114#119#036#081#188#239#197#120#025#007#164+ #208#104#165#135#124#159#016#155#191#108#160#029#250#130#094#082+ #107#253#088#153#199#091#252#227#163#024#056#115#209#218#125#235+ #032#076#212#230#118#000#132#008#137#246#049#233#142#065#051#015+ #151#066#166#167#069#099#168#236#249#223#201#172#241#046#133#217;
Les fonctions s'utilisent ainsi :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19 {$INCLUDE table.inc} function Encrypt(const s: ansistring): ansistring; var i: integer; begin SetLength(result, Length(s)); for i := 1 to Length(result) do result[i] := T1[s[i]]; end; function Decrypt(const s: ansistring): ansistring; var i: integer; begin SetLength(result, Length(s)); for i := 1 to Length(result) do result[i] := T2[s[i]]; end;
Il y a un programme qui permet de générer aléatoirement une nouvelle table.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13 uses Crypt; var mdp: ansistring; begin mdp := 'toto'; mdp := Encrypt(mdp); mdp := Decrypt(mdp); WriteLn(mdp); // toto
Partager