Nel quotidiano della consulenza ICT, specialmente quando si interfacciano infrastrutture aziendali con studi legali o Pubblica Amministrazione, emerge un limite tecnico tanto noto quanto frustrante: il limite di dimensione degli allegati della Posta Elettronica Certificata (PEC). La maggior parte dei provider impone un tetto massimo tra i 50 e i 100 MB. Ma come procedere quando è necessario trasmettere per via legale archivi di log, immagini forensi o interi progetti CAD che superano i svariati gigabyte?
La soluzione ottimale consiste nel disaccoppiare il trasporto del file dalla sua certificazione legale. In questo articolo vedremo come automatizzare tramite Python l'upload di un file su Google Cloud Storage, calcolarne l'hash SHA-256 per garantirne l'integrità e inviare automaticamente una PEC contenente il link di download e l'impronta crittografica.
L'Architettura della Soluzione
Includere l'hash crittografico del file all'interno del corpo di un messaggio PEC vincola legalmente quel file (ospitato esternamente) alla comunicazione certificata. Se anche un solo bit del file su Google Cloud Storage dovesse cambiare, l'hash non corrisponderebbe più a quello "notarizzato" dalla ricevuta di consegna della PEC.
- Calcolo dell'Hash: Utilizziamo SHA-256 per generare l'impronta univoca del file locale.
- Cloud Storage: Carichiamo il file su un bucket GCS e generiamo un URL firmato (Signed URL) o pubblico per il download.
- Automazione SMTP: Inviamo la PEC utilizzando le librerie standard di Python, autenticandoci sul server del provider PEC.
Lo Script Python: Implementazione Passo-Passo
Per eseguire questo script, assicurati di avere installato la libreria ufficiale di Google Cloud: pip install google-cloud-storage. Avrai inoltre bisogno di un Service Account JSON con i permessi di scrittura sul tuo bucket.
import hashlib
import smtplib
from email.message import EmailMessage
from google.cloud import storage
import os
# Configurazione Variabili
FILE_PATH = "C:\\Progetti\\file_enorme_da_inviare.zip"
BUCKET_NAME = "il-tuo-bucket-aziendale"
PEC_SENDER = "tua.email@pec.it"
PEC_PASSWORD = "LaTuaPasswordSicura"
PEC_RECIPIENT = "destinatario@pec.it"
SMTP_SERVER = "smtps.pec.aruba.it" # Esempio per Aruba PEC
SMTP_PORT = 465
def calculate_sha256(file_path):
"""Calcola l'hash SHA-256 di un file locale."""
sha256_hash = hashlib.sha256()
with open(file_path, "rb") as f:
# Legge il file a blocchi per gestire file di grandi dimensioni
for byte_block in iter(lambda: f.read(4096), b""):
sha256_hash.update(byte_block)
return sha256_hash.hexdigest()
def upload_to_gcs(file_path, bucket_name):
"""Carica il file su Google Cloud Storage e restituisce l'URL."""
# Imposta la variabile d'ambiente per l'autenticazione GCP
os.environ["GOOGLE_APPLICATION_CREDENTIALS"] = "service_account.json"
storage_client = storage.Client()
bucket = storage_client.bucket(bucket_name)
blob_name = os.path.basename(file_path)
blob = bucket.blob(blob_name)
print(f"[*] Upload in corso su GCS: {blob_name}...")
blob.upload_from_filename(file_path)
# Rende il file temporaneamente scaricabile (o accessibile)
# Nota: In produzione usare Signed URLs per maggiore sicurezza
blob.make_public()
return blob.public_url
def send_pec(file_url, file_hash):
"""Invia il link e l'hash tramite PEC."""
msg = EmailMessage()
msg['Subject'] = "Trasmissione Progetto e Hash Crittografico"
msg['From'] = PEC_SENDER
msg['To'] = PEC_RECIPIENT
corpo_messaggio = f"""
Gentile Utente,
Si trasmette in allegato virtuale il progetto richiesto.
A causa delle limitazioni di dimensione della PEC, il file è disponibile per il download al seguente link sicuro:
LINK DI DOWNLOAD: {file_url}
Per garantire l'integrità e la validità legale della trasmissione, si fornisce l'impronta crittografica del file:
ALGORITMO: SHA-256
HASH: {file_hash}
Cordiali saluti,
L'Amministratore di Sistema
"""
msg.set_content(corpo_messaggio)
print("[*] Connessione al server SMTP PEC...")
with smtplib.SMTP_SSL(SMTP_SERVER, SMTP_PORT) as server:
server.login(PEC_SENDER, PEC_PASSWORD)
server.send_message(msg)
print("[+] PEC inviata con successo!")
if __name__ == "__main__":
print("[*] Avvio calcolo Hash...")
file_hash = calculate_sha256(FILE_PATH)
print(f"[+] Hash SHA-256: {file_hash}")
file_url = upload_to_gcs(FILE_PATH, BUCKET_NAME)
print(f"[+] URL File: {file_url}")
send_pec(file_url, file_hash)
Conclusioni per l'IT Risk Management
Questa infrastruttura ibrida non solo risolve un blocco operativo gravoso, ma lo fa rispettando rigorosi standard di Information Security. Utilizzando i bucket cloud possiamo applicare policy di Data Retention automatizzate (ad esempio, l'eliminazione del blob dopo 30 giorni), mentre l'inserimento dell'hash nella transazione PEC sigilla il perimetro legale della nostra comunicazione aziendale.

Commenti
Posta un commento