Je cherche une commande ou des utilitaires pour calculer md5, sha1 hacha valeur par une commande.
Actuellement, Ubuntu a sha1sum
et md5sum
commande de calcul de la valeur hash
.
Vous pouvez y parvenir avec un bon ninja-fu bash. :)
Vous connaissez la procédure pour calculer un à la fois:
$ echo abc | md5sum
0bee89b07a248e27c83fc3d5951213c1 -
$ echo abc | sha1sum
03cfd743661f07975fa2f1220c5194cbaff48451 -
Edit: comme @gertvdijk l’a suggéré, et en lisant un peu plus les pages d’information, cela peut être fait directement avec tee et Process Substitution supportés par des shells modernes, sans redirections. De cette façon, vous pouvez transmettre vos données à deux processus et à un fichier en utilisant tee:
$ echo abc | tee >(md5sum) >(sha1sum) > output.txt
Il est également possible de chaîner si vous avez besoin de plus, mais vous devez vous occuper de STDOUT de tous les sous-processus. Cela ne vous donnera PAS le résultat attendu, mais mélange les deux premières sommes de contrôle avec les données du fichier output.txt:
$ echo abc | tee >(md5sum) >(sha1sum) | tee >(sha256sum) >(sha512sum) > output.txt
Si vous redirigez les sommes de contrôle vers un fichier à l'intérieur des processus substitués, vous pouvez les chaîner comme vous le souhaitez:
$ echo abc | tee >(md5sum > /tmp/md5.txt) >(sha1sum > /tmp/sha1.txt) | tee >(sha256sum > /tmp/sha256.txt) >(sha512sum > /tmp/sha512.txt) > output.txt
Voici ma suggestion initiale sans substitution de processus, mais qui permet une utilisation en chaîne/récursive sans mélanger les données et la sortie:
$ echo abc | tee -a /proc/self/fd/2 2> >(sha1sum) > >(md5sum)
0bee89b07a248e27c83fc3d5951213c1 -
03cfd743661f07975fa2f1220c5194cbaff48451 -
L'astuce consiste ici à utiliser tee
, qui duplique les données dans STDOUT et dans un fichier. Nous sommes intelligents en lui disant d'écrire les données dans le fichier/proc/self/fd/2, qui est toujours le descripteur de fichier STDERR du processus actuel. Et avec la syntaxe > >(program)
, nous pouvons rediriger chaque descripteur de fichier vers le STDIN d'un programme au lieu d'un fichier. Tout comme |
, mais avec plus de contrôle. > >(md5sum)
redirige STDOUT vers le programme md5sum
, tandis que 2> >(sha1sum)
redirige STDERR vers le programme sha1sum
.
Notez que l'ordre de 2>
et >
semble avoir de l'importance, je dois donc mettre 2>
en premier sur la ligne de commande. Celles-ci sont évaluées de droite à gauche, mais je ne sais pas pourquoi cela fait une différence.
Pour ce faire sur un fichier ou un disque dur, vous devez remplacer "echo abc" par un chat ou un dd, par exemple:
dd if=/dev/sda bs=8k | tee -a /proc/self/fd/2 2> >(sha1sum) > >(md5sum)
La chose intéressante à ce sujet est que vous pouvez réellement recurse et exécuter plusieurs à la fois, pas seulement deux. La syntaxe devient poilue, mais cela fonctionne:
echo abc | tee -a /proc/self/fd/2 2> >(tee -a /proc/self/fd/2 2> >(sha256sum) > >(sha384sum) ) > >(sha512sum)
Si vous voulez capturer le résultat et l'utiliser dans un script, cela fonctionne aussi:
A=$(echo abc | tee -a /proc/self/fd/2 2> >(sha1sum) > >(md5sum))
Maintenant, $A
est une chaîne contenant toute la sortie, y compris les nouvelles lignes. Vous pouvez analyser les valeurs plus tard aussi:
echo "checksum=[$(echo "$A" | head -1 | cut -d " " -f 1)]"
Je ne suis pas sûr que vous ayez la moindre garantie quant à la commande de la sortie.
Je ne peux pas vous aider avec la ligne de commande, mais je connais un outil graphique nommé quickhash.
Vous pouvez télécharger cet outil depuis Quickhash
La description:
Une interface graphique Linux et Windows permettant la sélection rapide et le hachage ultérieur des fichiers (individuellement ou de manière récursive dans une structure de dossiers) du texte et des disques (sous Linux). Conçu pour Linux, mais également disponible pour Windows. MD5, SHA1, SHA256, SHA512 disponibles. La sortie copiée dans le Presse-papiers ou enregistrée en tant que fichier CSV\HTML.
Here i have find one python script from source which calculate hash values. and also i find some statistics about hash value calculation.
- `md5sum` takes 00:3:00 min to calculate 4GB USB.
- `sha2sum` takes 00:3:01 min to calculate 4GB USB.
- While phython script takes 3:16 min to calculate both MD5 and SHA1.
// le script commence à partir d'ici
def get_custom_checksum(input_file_name):
from datetime import datetime
starttime = datetime.now()
# START: Actual checksum calculation
from hashlib import md5, sha1, sha224, sha384, sha256, sha512
#chunk_size = 1 # 1 byte -- NOT RECOMENDED -- USE AT LEAST 1KB. When 1KB takes 1 min to run, 1B takes 19 minutes to run
#chunk_size = 1024 # 1 KB
chunk_size = 1048576 # 1024 B * 1024 B = 1048576 B = 1 MB
file_md5_checksum = md5()
file_sha1_checksum = sha1()
try:
with open(input_file_name, "rb") as f:
byte = f.read(chunk_size)
previous_byte = byte
byte_size = len(byte)
file_read_iterations = 1
while byte:
file_md5_checksum.update(byte)
file_sha1_checksum.update(byte)
previous_byte = byte
byte = f.read(chunk_size)
byte_size += len(byte)
file_read_iterations += 1
except IOError:
print ('File could not be opened: %s' % (input_file_name))
#exit()
return
except:
raise
# END: Actual checksum calculation
# For storage purposes, 1024 bytes = 1 kilobyte
# For data transfer purposes, 1000 bits = 1 kilobit
kilo_byte_size = byte_size/1024
mega_byte_size = kilo_byte_size/1024
giga_byte_size = mega_byte_size/1024
bit_size = byte_size*8
kilo_bit_size = bit_size/1000
mega_bit_size = kilo_bit_size/1000
giga_bit_size = mega_bit_size/1000
last_chunk_size = len(previous_byte)
stoptime = datetime.now()
processtime = stoptime-starttime
custom_checksum_profile = {
'starttime': starttime,
'byte_size': byte_size,
'kilo_byte_size': kilo_byte_size,
'mega_byte_size': mega_byte_size,
'giga_byte_size': giga_byte_size,
'bit_size': bit_size,
'kilo_bit_size': kilo_bit_size,
'mega_bit_size': mega_bit_size,
'giga_bit_size': giga_bit_size,
'file_read_iterations': file_read_iterations,
'last_chunk_size': last_chunk_size,
'md5_checksum': file_md5_checksum.hexdigest(),
'sha1_checksum': file_sha1_checksum.hexdigest(),
'stoptime': stoptime,
'processtime': processtime,
}
return custom_checksum_profile
def print_custom_checksum(input_file_name):
custom_checksum_profile = get_custom_checksum(input_file_name)
try:
print 'Start Time ::', custom_checksum_profile['starttime']
custom_checksum_profile ['file_read_iterations']) # print ('Last Chunk (bytes):', custom_checksum_profile ['last_chunk_size']) print 'bricolage et des recherches sur les produits de qualité '] print' Stop Time :: ', custom_checksum_profile [' stoptime '] print' Temps de traitement :: ', custom_checksum_profile [' processtime '] sauf TypeError: # L'objet' NoneType 'n'est pas souscriptable - cela devrait se produire lorsque l'essentiel le fichier d'entrée n'a pas pu être ouvert # passe passe # sortie csv
import argparse
script_version='0.0.2'
parser = argparse.ArgumentParser(description='Determine and print various checksums of an input file and its size. Supported checksums are MD5, SHA1, SHA224, SHA256, SHA384, and SHA512.', version=script_version)
parser.add_argument('-f', '--file', metavar='in-file', action='store', dest='file_name', type=str, required=True, help='Name of file for which the checksum needs to be calculated')
args = parser.parse_args()
print 'Processing File ::', args.file_name
print_custom_checksum(args.file_name)