Calculer un MD5 sous Delphi

Jusqu'à ce que je travaille sur Internet je n'ai jamais eu à utiliser d'encodage MD5 depuis des données textuelles ou comme checksum d'un fichier. On passe désormais plutôt par SHA1 pour les checksum afin de réduire les risques.

A défaut d'utiliser une librairie robuste de fonctions cryptographiques comme celle disponible chez TMS Software, l'algorithme du MD5 est suffisant pour des choses basiques et non réversibles. Il faut juste être à la fois attentif à ce qu'on en fait et conscient qu'il y a des tables de correspondance en circulation sur Internet.

Il ne faut jamais encoder des mots de passe en MD5. Le darknet en est plein...

En codant un mot de passe en MD5, grâce aux tables de correspondance, il est possible à un agresseur ayant eu connaissance de la version encodée d'utiliser un autre mot de passe que celui de l'utilisateur pour accéder quand même à son compte. Bien entendu on peut jouer en introduisant autre chose que le mot de passe dans la chaine encodée, histoire de brouiller les pistes, mais méfiance quand même.

Je me sers de MD5 essentiellement pour réduire des textes ou zones mémoires à une série de 32 caractères (chiffres et lettres de A à F).

La fonction md5() de PHP m'a servi à de nombreuses reprises pour des contrôles d'intégrité.Je voulais faire de même avec Delphi lors d'échanges avec certaines de mes API. Hors il n'y a pas de fonction md5() dans les librairies de Delphi.

Il a donc fallu que je fasse quelques recherches et tombe sur une solution en ligne (je ne retrouve pas le lien et ne peux donc l'en créditer). Voici l'unité que j'en ai fait :

unit u_md5;

interface

/// <summary>Get MD5 code from a string</summary>
/// <param name="S">String to encode</param>
/// <returns>The function return the MD5 of the S string.</returns>
function MD5(S: String): String;

implementation

uses
  IdHashMessageDigest, System.SysUtils;

function MD5(S: String): String;
var
  ch: string;
begin
  with TIdHashMessageDigest5.Create do
  begin
    ch := HashStringAsHex(S);
    DisposeOf;
  end;
  result := ch.ToLower;
end;

end.

Cette unité Pascal est compatible VCL et Firemonkey.
Elle utilise la librairie system SysUtils pour obtenir la chaine finale en minuscules grâce aux Helpers du type String. J'aurais très bien pu utiliser l'autre forme de réduction des majuscules, mais c'est tellement plus simple de l'écrire de cette façon moderne.
L'unité utilise également une partie du projet Indy bien pratique pour tout ce qui touche au web. Le coeur de Indy accompagne Delphi depuis des lustres, quelle que soit l'édition, vous devriez donc l'avoir en standard et ne pas avoir besoin de l'installer via GetIt.

Vous êtes libres d'utiliser cette unité comme bon vous semble, tant que vous prenez bien l'avertissement ci-dessus en compte.

Je vous montrerai prochainement un cas d'utilisation très pratique pour du dialogue entre un site web et une application mobile.


A lire aussi

Evitez les plantages causés par une mauvaise utilisation de la librairie System.JSON (18/04/2018)
Plutôt INI ou JSON pour stocker vos paramètres ? (21/07/2017)
Calculer et vérifier un checksum pour dialoguer avec l'extérieur (19/07/2017)
Télécharger simplement un fichier via Internet en tâche de fond (10/07/2017)
Calculer un MD5 sous Delphi (04/07/2017)
Les threads et le blocage des écrans (14/06/2017)
Utilisation de processus sous Delphi : fonctionnement de base. (04/06/2017)
Passer un traitement lourd en tâche de fond sans bloquer l'écran (04/06/2017)
Ajouter des chaînes de caractères vides dans un objet JSON (19/05/2017)
Configurer le firewall de McAfee AntiVirus Plus pour utiliser l'App Tethering (28/06/2016)