Calcul du Hash des fichiers chez Secure Exchanges

Calcul du Hash des fichiers chez Secure Exchanges

Chez Secure Exchanges, nous utilisons une méthode robuste et efficace pour calculer le hash SHA-512 de fichiers de toutes tailles. Notre approche assure la sécurité et l'intégrité des données tout en optimisant les performances pour les fichiers volumineux.

Méthode de Calcul du Hash

  1. Fichiers de 1 Go ou moins :

    • Pour les fichiers de taille égale ou inférieure à 1 Go, nous utilisons une méthode standard de calcul du hash SHA-512 en une seule passe sur l'ensemble du fichier.
  2. Fichiers de plus de 1 Go :

    • Pour les fichiers de taille supérieure à 1 Go, nous divisons le fichier en blocs de 100 MB.
    • Nous calculons le hash SHA-512 de chaque bloc individuellement.
    • Nous combinons les hashes de chaque bloc en une seule chaîne.
    • Nous calculons le hash final de cette chaîne combinée.

Consultation en Ligne

Pour offrir à nos utilisateurs une flexibilité maximale, quiconque détient un fichier peut également consulter notre page dédiée pour calculer le hash de leur fichier : Calculateur de Hash. Ce service est conçu pour fournir un calcul rapide et fiable du hash, quel que soit la taille du fichier.

À partir du 24 juin 2024, nous avons mis en œuvre cette nouvelle méthode de calcul du hash pour améliorer les performances et la gestion des fichiers volumineux. Avant cette date, le hash était calculé de manière traditionnelle. Cette mise à jour reflète notre engagement continu à optimiser nos services pour répondre aux besoins de nos utilisateurs.

Chez Secure Exchanges, nous nous engageons à fournir des solutions sécurisées et performantes pour tous vos besoins de gestion de fichiers.

Exemple de Code

Voici des exemples de code en C#, JavaScript pour calculer le hash SHA-512 d'un fichier en utilisant notre approche.

c#
  1. using System;
  2. using System.Collections.Generic;
  3. using System.IO;
  4. using System.Security.Cryptography;
  5. using System.Text;

  6. public static class Hashing
  7. {
  8.     public static string GetSHA512OfFile(string filePath)
  9.     {
  10.         if (File.Exists(filePath))
  11.         {
  12.             const int chunkSize = 100 * 1024 * 1024; // 100 MB
  13.             const long largeFileTrigger = 1000 * 1024 * 1024; // 1 GB
  14.             FileInfo fileInfo = new FileInfo(filePath);
  15.             long fileSize = fileInfo.Length;

  16.             if (fileSize <= largeFileTrigger)
  17.             {
  18.                 // For files smaller than or equal to 1 GB, calculate hash directly
  19.                 using (var stream = new BufferedStream(File.OpenRead(filePath), chunkSize))
  20.                 {
  21.                     return GetSHA512OfStream(stream);
  22.                 }
  23.             }
  24.             else
  25.             {
  26.                 // For files larger than 1 GB, use chunked approach
  27.                 List<string> blockHashes = new List<string>();
  28.                 using (var stream = new BufferedStream(File.OpenRead(filePath), chunkSize))
  29.                 {
  30.                     byte[] buffer = new byte[chunkSize];
  31.                     int bytesRead;
  32.                     while ((bytesRead = stream.Read(buffer, 0, chunkSize)) > 0)
  33.                     {
  34.                         using (SHA512 sha512 = SHA512.Create())
  35.                         {
  36.                             byte[] chunkHash = sha512.ComputeHash(buffer, 0, bytesRead);
  37.                             blockHashes.Add(BitConverter.ToString(chunkHash).Replace("-", "").ToLower());
  38.                         }
  39.                     }
  40.                 }
  41.                 // Combine block hashes and calculate final hash
  42.                 string combinedHashString = string.Join("", blockHashes);
  43.                 using (SHA512 sha512 = SHA512.Create())
  44.                 {
  45.                     byte[] finalHash = sha512.ComputeHash(Encoding.UTF8.GetBytes(combinedHashString));
  46.                     return BitConverter.ToString(finalHash).Replace("-", "").ToUpper();
  47.                 }
  48.             }
  49.         }
  50.         else
  51.         {
  52.             return null;
  53.         }
  54.     }

  55.     public static string GetSHA512OfStream(Stream stream)
  56.     {
  57.         using (var sha = SHA512.Create())
  58.         {
  59.             return GetHexaString(sha.ComputeHash(stream));
  60.         }
  61.     }

  62.     private static string GetHexaString(byte[] hash)
  63.     {
  64.         if (hash != null)
  65.         {
  66.             StringBuilder sb = new StringBuilder();
  67.             for (int i = 0; i < hash.Length; i++)
  68.             {
  69.                 sb.Append(hash[i].ToString("X2"));
  70.             }
  71.             return sb.ToString();
  72.         }
  73.         return string.Empty;
        }
    }

Javascript

  1. var window = self;
  2. var document = {};

  3. onmessage = async function (args) {
  4.     var obj = args.data;
  5.     let reader = new FileReader();
  6.     var hash = {};
  7.     var chunkSize = 100 * 1024 * 1024; // 100MB chunk size for large files
  8.     var largeFileTrigger = 1000 * 1024 * 1024; // 1GB file will use block approach
  9.     var isLargeFile = obj.File.size > largeFileTrigger;

  10.     const chunksQuantity = Math.ceil(obj.File.size / chunkSize);
  11.     const chunksQueue = new Array(chunksQuantity).fill().map((_, index) => index).reverse();

  12.     let blockHashes = [];

  13.     reader.onload = async function (evt) {
  14.         if (isLargeFile) {
  15.             let blockHash = await digestMessage(evt.currentTarget.result);
  16.             blockHashes.push(blockHash);
  17.         } else {
  18.             blockHashes.push(evt.currentTarget.result);
  19.         }
  20.         readNext();
  21.     }

  22.     let readNext = async function () {
  23.         if (chunksQueue.length > 0) {
  24.             const chunkId = chunksQueue.pop();
  25.             const sentSize = chunkId * chunkSize;
  26.             const chunk = obj.File.slice(sentSize, sentSize + chunkSize);
  27.             reader.readAsArrayBuffer(chunk);
  28.         } else {
  29.             reader.abort();
  30.             var hexHash = null;
  31.             if (isLargeFile) {
  32.                 let combinedHashBuffer = new TextEncoder().encode(blockHashes.join(''));
  33.                 hexHash = await digestMessage(combinedHashBuffer);
  34.             } else {
  35.                 hexHash = await digestMessage(blockHashes[0]);
  36.             }

  37.             hash.SHA512 = hexHash.toUpperCase();
  38.             postMessage({ Hash: hash, File: obj.File, ID: obj.ID, ReturnObject: obj.ReturnObject });
  39.         }
  40.     }

  41.     readNext();
  42. }

  43. // Function to digest message and return hex string
  44. async function digestMessage(buffer) {
  45.     const hashBuffer = await crypto.subtle.digest('SHA-512', buffer);
  46.     const hashArray = Array.from(new Uint8Array(hashBuffer));
  47.     const hashHex = hashArray.map(b => b.toString(16).padStart(2, '0')).join('');
  48.     return hashHex;
  49. }

    • Related Articles

    • Installation du nouveau certificat SSL de Secure Exchanges - Administrateur

      Si vous avez une autre procédure, vous pouvez bien sûr l'utiliser. Le script que nous proposons est simplement une aide pour simplifier le processus. L'important, c'est de vous s'assurer que notre nouveau certificat soit bien ajouté dans ...
    • L'Analyse de Vulnérabilité de Secure Exchanges

      Secure Exchanges offre une fonctionnalité d'analyse de vulnérabilité pour aider à détecter des échanges contenant des informations potentiellement vulnérables et à risque d'être compromises. Voici un guide étape par étape pour utiliser cette fonction ...
    • Quels sont les paramètres de configuration de Secure Exchanges sur Gmail?

      Pour configurer les paramètres de Secure Exchanges sur Gmail, vous devez cliquer sur l'extension Secure Exchanges puis sur Paramètres. Vous verrez donc apparaître la fenêtre suivante incluant diverses options: Vous pouvez ainsi définir les options ...
    • Comment conserver les fichiers cryptés ?

      Pour que SESAR conserve vos fichiers chiffrés sur disque, vous devez générer une nouvelle clé publique/privée. Conservez la clé privée en lieu sûr et partagez avec l’équipe de Secure Exchanges votre clé publique. (pour utiliser SESAR restore vous ...
    • Quels sont les paramètres de configuration de Secure Exchanges sur Outlook?

      Divers paramètres Secure Exchanges peuvent être configurés sur Outlook : 1. Paramètres de message : Sur ce volet, vous pouvez définir les options d'envoi et de réception de vos courriels sécurisés, la langue de votre connecteur et de communication, ...