Upload files to "/"
This commit is contained in:
84
hash.py
Normal file
84
hash.py
Normal file
@@ -0,0 +1,84 @@
|
||||
#!/usr/bin/env python3
|
||||
|
||||
import argparse
|
||||
import hashlib
|
||||
import sys
|
||||
from pathlib import Path
|
||||
|
||||
DEFAULT_BLOCK_SIZE = 1024 * 1024 # 1 MB
|
||||
SUPPORTED_ALGOS = ["md5", "sha1", "sha224", "sha256"]
|
||||
|
||||
def compute_hash(path: Path, algorithm: str, block_size: int = DEFAULT_BLOCK_SIZE) -> str:
|
||||
"""Compute the hash of a file using the chosen algorithm."""
|
||||
try:
|
||||
h = hashlib.new(algorithm)
|
||||
except ValueError:
|
||||
raise SystemExit(f"Error: Unsupported hash algorithm '{algorithm}'")
|
||||
|
||||
with path.open("rb") as f:
|
||||
for chunk in iter(lambda: f.read(block_size), b""):
|
||||
h.update(chunk)
|
||||
|
||||
return h.hexdigest()
|
||||
|
||||
def main():
|
||||
parser = argparse.ArgumentParser(
|
||||
description="Compute hash(es) of a file or verify against a known hash."
|
||||
)
|
||||
parser.add_argument("file", type=Path, help="Path to the file to hash")
|
||||
parser.add_argument(
|
||||
"known_hash",
|
||||
nargs="?",
|
||||
help="Optional known hash to verify the file against",
|
||||
)
|
||||
|
||||
parser.add_argument("-md5", action="store_true", help="Use MD5 algorithm")
|
||||
parser.add_argument("-sha1", action="store_true", help="Use SHA-1 algorithm")
|
||||
parser.add_argument("-sha224", action="store_true", help="Use SHA-224 algorithm")
|
||||
parser.add_argument("-sha256", action="store_true", help="Use SHA-256 algorithm")
|
||||
|
||||
args = parser.parse_args()
|
||||
|
||||
if not args.file.exists() or not args.file.is_file():
|
||||
print(f"Error: File not found -> {args.file}", file=sys.stderr)
|
||||
sys.exit(1)
|
||||
|
||||
selected_algos = [
|
||||
algo
|
||||
for algo, used in {
|
||||
"md5": args.md5,
|
||||
"sha1": args.sha1,
|
||||
"sha224": args.sha224,
|
||||
"sha256": args.sha256,
|
||||
}.items()
|
||||
if used
|
||||
]
|
||||
|
||||
if not selected_algos:
|
||||
selected_algos = ["sha1"] if args.known_hash else SUPPORTED_ALGOS
|
||||
|
||||
print()
|
||||
if args.known_hash:
|
||||
# Verification mode
|
||||
algo = selected_algos[0]
|
||||
digest = compute_hash(args.file, algo)
|
||||
print(f"{algo.upper()} hash: {digest}")
|
||||
if digest.lower() == args.known_hash.lower():
|
||||
print("\033[32mCorrect\033[0m")
|
||||
print("")
|
||||
sys.exit(0)
|
||||
else:
|
||||
print("\033[31mIncorrect\033[0m")
|
||||
print("")
|
||||
sys.exit(1)
|
||||
else:
|
||||
# Normal hashing mode
|
||||
print("Algorithm Hash")
|
||||
print("--------- ----")
|
||||
for algo in selected_algos:
|
||||
digest = compute_hash(args.file, algo)
|
||||
print(f"{algo.upper():<8} {digest}")
|
||||
print()
|
||||
|
||||
if __name__ == "__main__":
|
||||
main()
|
||||
Reference in New Issue
Block a user