1 votes

Pouvez-vous utiliser OpenSSL pour générer un hachage md5 ou sha sur un répertoire de fichiers ?

Je suis intéressé par le stockage d'un indicateur d'intégrité de fichiers / répertoires entre deux copies archivées de répertoires. Il s'agit d'environ 1 To de données stockées de manière récursive sur des disques durs. Y a-t-il un moyen d'utiliser OpenSSL pour générer un seul hachage pour tous les fichiers qui peut être utilisé comme une comparaison entre deux copies des données, ou à un moment ultérieur pour vérifier les données n'ont pas changé ?

3voto

Dalroth Points 2468

Il n'est pas possible de faire un hachage cumulatif de tous les éléments pour obtenir un seul hachage, mais on peut d'abord les compresser puis calculer le hachage :

$tar -czpf archive1.tar.gz folder1/
$tar -czpf archive2.tar.gz folder2/
$openssl md5 archive1.tar.gz archive2.tar.gz

pour hacher récursivement chaque fichier :

$find . -type f -exec openssl md5 {} +

1 votes

1TB de données - pas de place pour les goudronner. Existe-t-il un moyen de générer récursivement les hachages de tous les fichiers ?

0 votes

Oui, je l'ai ajouté à ma réponse.

0 votes

Bonne idée de tar, mais pas toujours applicable. la méthode 'find' est meilleure en général. s'il n'y a 'pas de place' pour le tarball : % tar -cf - folder | openssl md5

3voto

AaronLS Points 2223

Vous pourriez générer récursivement tous les hachages, concaténer les hachages dans un seul fichier, puis générer un hachage de ce fichier.

1 votes

Pour une seule commande, quelque chose comme md5 -q <(find . -type f 2>/dev/null | xargs md5 -q | sort) fonctionne bien dans Bash et ne nécessite pas de fichier temporaire. Alter si votre système utilise md5sum au lieu de md5 . Sachez également que sort peut se comporter différemment sur différentes plateformes, ce qui affectera la somme de contrôle finale si l'ordre est différent. Ajoutez des drapeaux comme ! -name ".DS_Store" au composant find pour ignorer certains fichiers, comme les fichiers .DS_Store sur Mac OS X qui peuvent fausser la somme de contrôle puisqu'ils sont générés par le système d'exploitation.

2voto

Brian Sullivan Points 101

Faire une somme md5 sur le tar ne fonctionnerait jamais à moins que toutes les métadonnées (date de création, etc.) soient également identiques, parce que tar les stocke dans son archive.

Je ferais probablement une somme md5 du contenu de tous les fichiers :

find folder1 -type f | sort | tr '\n' '\0' | xargs -0 cat | openssl md5
find folder2 -type f | sort | tr '\n' '\0' | xargs -0 cat | openssl md5

2voto

c-tools Points 21

Vous devriez probablement être intéressé par la sortie du condensé au format coreutils (identique à md5sum -b)

Donc la commande md5sum pourrait être :

find . -path '*/.svn' -prune -o -type f -print0 | sort | tr '\n' '\0' | xargs -0 openssl dgst -md5 -r 

ou avec une sortie vers un fichier

find . -path '*/.svn' -prune -o -type f -print0 | sort | tr '\n' '\0' | xargs -0 openssl dgst -md5 -r > ../mydigest.md5

2voto

BotOfWar Points 141

Il est préférable de lister un hachage pour chaque fichier, et de vérifier chaque hachage. Si vous faites un hachage de tous les fichiers, et que l'un d'entre eux est corrompu, vous ne saurez pas lequel est corrompu. Mais si vous listez les hachages pour chaque fichier, un script peut vous dire quand un hachage ne correspond pas (ce qui vous indiquera qu'un fichier est corrompu ou modifié).

De même, le hachage récursif avec find est plus simple que tant de tuyauterie :

find . -type f -print0 | xargs -0 openssl dgst -sha256 -r >> hashes.sha256

Vous voudrez ajouter la sortie via >> car xargs invoquera openssl plusieurs fois, mais seulement aussi souvent que nécessaire pour traiter tous les fichiers (pas par exemple une invocation par fichier). -r est pour la syntaxe des fichiers de hachage de coreutils. Vous ne souhaitez pas utiliser la syntaxe -out con xargs car il écrasera le fichier à chaque invocation. De plus, vous pouvez vouloir capturer STDERR, au cas où OpenSSL ne pourrait pas lire/ouvrir certains fichiers : 2>> error.log

Si le stockage n'est pas un goulot d'étranglement, vous pouvez utiliser l'outil de gestion de l'espace. -P n argument de xargs pour exécuter plusieurs processus OpenSSL en parallèle (non recommandé pour les disques durs).

note : Les GNU coreutils (md5sum etc.) utilisent OpenSSL comme bibliothèque pour le hachage. Mais vous pouvez toujours vouloir utiliser OpenSSL à la place si vos coreutils sont très obsolètes : Support pour H/W Accélération du SHA-hash n'a été ajouté que récemment à OpenSSL. SHA1/SHA256 peuvent être plus rapides que MD5 sans accélération, et sont définitivement dans la gamme du gigabit/s avec elle.

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X