Dans un article précédent, j’avais montré comment calculer un hachage MD5 et SHA1 avec Indy. Je me suis rendu compte cette semaine qu’il existait depuis C++Builder XE8 une manière d’effectuer ces mêmes calculs sans avoir de dépendance sur la bibliothèque de communication Indy.
Tout d’abord, il faut ajouter le fichier d’en-tête suivant:
#include <System.Hash.hpp>
Pour MD5, il faut ce code:
String __fastcall TForm1::GetHashMD5(const String AFileName)
{
System::Hash::THashMD5 LMd5 = System::Hash::THashMD5::Create();
System::Classes::TFileStream* LFileStream = NULL;
try
{
LFileStream = new System::Classes::TFileStream(AFileName,
fmOpenRead | fmShareDenyWrite);
System::DynamicArray<System::Byte> Buffer;
Buffer.Length = LFileStream->Size;
LFileStream->Read(&Buffer[0], Buffer.Length);
LMd5.Update(Buffer);
}
__finally
{
delete LFileStream;
}
return LMd5.HashAsString().UpperCase();
}
Pour SHA1, on utilise ce code:
String __fastcall TForm1::GetHashSHA1(const String AFileName)
{
System::Hash::THashSHA1 LSha1 = System::Hash::THashSHA1::Create();
System::Classes::TFileStream* LFileStream = NULL;
try
{
LFileStream = new System::Classes::TFileStream(AFileName,
fmOpenRead | fmShareDenyWrite);
System::DynamicArray<System::Byte> Buffer;
Buffer.Length = LFileStream->Size;
LFileStream->Read(&Buffer[0], Buffer.Length);
LSha1.Update(Buffer);
}
__finally
{
delete LFileStream;
}
return LSha1.HashAsString().UpperCase();
}
Une nouvelle version de l’IDE, C++Builder 10 Seattle, est maintenant disponible. L’unité System::Hash a un nouveau membre. Il s’agit de THashSHA2. Il implémente la famille de fonctions de hachage SHA-2:
enum DECLSPEC_DENUM TSHA2Version : unsigned char { SHA224, SHA256, SHA384, SHA512, SHA512_224, SHA512_256 };