{"id":33089,"date":"2025-06-03T10:00:00","date_gmt":"2025-06-03T08:00:00","guid":{"rendered":"https:\/\/www.codemotion.com\/magazine\/?p=33089"},"modified":"2025-06-03T16:32:31","modified_gmt":"2025-06-03T14:32:31","slug":"la-signature-chain-garanzia-di-autenticita-integrita-e-sequenzialita-nei-documenti-digitali","status":"publish","type":"post","link":"https:\/\/www.codemotion.com\/magazine\/it\/backend-it\/la-signature-chain-garanzia-di-autenticita-integrita-e-sequenzialita-nei-documenti-digitali\/","title":{"rendered":"La signature chain: garanzia di autenticit\u00e0, integrit\u00e0 e sequenzialit\u00e0 nei documenti digitali"},"content":{"rendered":"\n<p>Nell&#8217;era digitale, la gestione sicura e affidabile dei documenti \u00e8 una sfida cruciale. Assicurare che un documento non sia stato alterato e che le firme apposte siano autentiche e in una sequenza specifica \u00e8 fondamentale per processi legali, finanziari e amministrativi.<\/p>\n\n\n\n<p>L&#8217;obiettivo dell&#8217;articolo si propone di illustrare la <strong>Signature Chain<\/strong> come soluzione per la sicurezza dei documenti digitali, garantendo l&#8217;inalterabilit\u00e0 perpetua delle firme, l&#8217;integrit\u00e0 del contenuto e la rigorosa sequenzialit\u00e0 delle apposizioni. Tale metodologia conferisce un elevato grado di affidabilit\u00e0, assicurando l&#8217;inviolabilit\u00e0 del documento e l&#8217;immodificabilit\u00e0 della sua cronistoria. Per una comprensione pratica, l&#8217;articolo include anche un esempio dimostrativo tramite una <strong>Proof of Concept (PoC)<\/strong>.<\/p>\n\n\n\t\t\t\t<div class=\"wp-block-uagb-table-of-contents uagb-toc__align-left uagb-toc__columns-1  uagb-block-6367ca94      \"\n\t\t\t\t\tdata-scroll= \"1\"\n\t\t\t\t\tdata-offset= \"30\"\n\t\t\t\t\tstyle=\"\"\n\t\t\t\t>\n\t\t\t\t<div class=\"uagb-toc__wrap\">\n\t\t\t\t\t\t<div class=\"uagb-toc__title\">\n\t\t\t\t\t\t\tIndice\t\t\t\t\t\t<\/div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<div class=\"uagb-toc__list-wrap \">\n\t\t\t\t\t\t<ol class=\"uagb-toc__list\"><li class=\"uagb-toc__list\"><a href=\"#cos\u00e8-una-signature-chain\" class=\"uagb-toc-link__trigger\">Cos&#039;\u00e8 una Signature Chain<\/a><li class=\"uagb-toc__list\"><a href=\"#architettura-e-funzionamento\" class=\"uagb-toc-link__trigger\">Architettura e funzionamento<\/a><li class=\"uagb-toc__list\"><a href=\"#esempio-di-record-nella-tabella\" class=\"uagb-toc-link__trigger\">Esempio di record nella tabella<\/a><ul class=\"uagb-toc__list\"><li class=\"uagb-toc__list\"><a href=\"#blocco-1-genesi-firmatario-antonio\" class=\"uagb-toc-link__trigger\">Blocco 1 (Genesi &#8211; Firmatario: Antonio)<\/a><li class=\"uagb-toc__list\"><li class=\"uagb-toc__list\"><a href=\"#blocco-2-firmatario-marianna\" class=\"uagb-toc-link__trigger\">Blocco 2 (Firmatario: Marianna)<\/a><\/li><\/ul><\/li><li class=\"uagb-toc__list\"><a href=\"#schema-della-catena-delle-firme\" class=\"uagb-toc-link__trigger\">Schema della catena delle firme<\/a><li class=\"uagb-toc__list\"><a href=\"#meccanismi-di-sicurezza-in-postgresql-per-la-signature-chain\" class=\"uagb-toc-link__trigger\">Meccanismi di Sicurezza in PostgreSQL per la Signature Chain<\/a><ul class=\"uagb-toc__list\"><li class=\"uagb-toc__list\"><a href=\"#1-principio-del-privilegio-minimo-least-privilege-principle\" class=\"uagb-toc-link__trigger\">1. Principio del Privilegio Minimo (Least Privilege Principle)<\/a><li class=\"uagb-toc__list\"><li class=\"uagb-toc__list\"><a href=\"#2-sicurezza-a-livello-di-riga-row-level-security-rls\" class=\"uagb-toc-link__trigger\">2. Sicurezza a Livello di Riga (Row Level Security &#8211; RLS)<\/a><li class=\"uagb-toc__list\"><li class=\"uagb-toc__list\"><a href=\"#3-revoca-esplicita-dei-permessi\" class=\"uagb-toc-link__trigger\">3. Revoca Esplicita dei Permessi<\/a><\/li><\/ul><\/li><\/ul><\/li><li class=\"uagb-toc__list\"><a href=\"#verifica-dellintegrit\u00e0-del-documento-originale-considerazioni-esterne\" class=\"uagb-toc-link__trigger\">Verifica dell&#039;integrit\u00e0 del documento originale (considerazioni esterne)<\/a><li class=\"uagb-toc__list\"><a href=\"#caratteristiche-chiave-della-catena\" class=\"uagb-toc-link__trigger\">Caratteristiche chiave della catena<\/a><li class=\"uagb-toc__list\"><a href=\"#come-avviare-la-poc\" class=\"uagb-toc-link__trigger\">Come avviare la PoC<\/a><ul class=\"uagb-toc__list\"><li class=\"uagb-toc__list\"><a href=\"#1-requisiti\" class=\"uagb-toc-link__trigger\">1. Requisiti<\/a><li class=\"uagb-toc__list\"><li class=\"uagb-toc__list\"><a href=\"#2-configurazione-variabili-dambiente-opzionale\" class=\"uagb-toc-link__trigger\">2. Configurazione variabili d&#039;ambiente (opzionale)<\/a><li class=\"uagb-toc__list\"><li class=\"uagb-toc__list\"><a href=\"#3-avvio-del-database-postgresql\" class=\"uagb-toc-link__trigger\">3. Avvio del database PostgreSQL<\/a><li class=\"uagb-toc__list\"><li class=\"uagb-toc__list\"><a href=\"#4-esegui-lo-script-di-firma-e-verifica\" class=\"uagb-toc-link__trigger\">4. Esegui lo script di firma e verifica<\/a><li class=\"uagb-toc__list\"><li class=\"uagb-toc__list\"><a href=\"#5-verifica-della-catena\" class=\"uagb-toc-link__trigger\">5. Verifica della Catena<\/a><\/li><\/ul><\/li><\/ul><\/li><\/ul><li class=\"uagb-toc__list\"><a href=\"#output-atteso-estratto\" class=\"uagb-toc-link__trigger\">Output atteso (estratto)<\/a><\/li><li class=\"uagb-toc__list\"><a href=\"#appendice-considerazioni-sugli-algoritmi-crittografici\" class=\"uagb-toc-link__trigger\">Appendice: considerazioni sugli algoritmi crittografici<\/a><ul class=\"uagb-toc__list\"><li class=\"uagb-toc__list\"><a href=\"#alternative-per-lhashing\" class=\"uagb-toc-link__trigger\">Alternative per l&#039;Hashing<\/a><li class=\"uagb-toc__list\"><li class=\"uagb-toc__list\"><a href=\"#alternative-per-la-firma-digitale\" class=\"uagb-toc-link__trigger\">Alternative per la Firma Digitale<\/a><li class=\"uagb-toc__list\"><li class=\"uagb-toc__list\"><a href=\"#fattori-da-considerare-per-la-scelta\" class=\"uagb-toc-link__trigger\">Fattori da Considerare per la Scelta<\/a><\/li><\/ul><\/li><li class=\"uagb-toc__list\"><a href=\"#conclusioni\" class=\"uagb-toc-link__trigger\">Conclusioni<\/a><\/ul><\/ol>\t\t\t\t\t<\/div>\n\t\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\n\n\n<h2 class=\"wp-block-heading\" id=\"h-cos-e-una-signature-chain\">Cos&#8217;\u00e8 una Signature Chain<\/h2>\n\n\n\n<p>La Signature Chain \u00e8 un meccanismo crittografico che crea una sequenza immutabile di firme digitali su un documento, garantendone autenticit\u00e0, integrit\u00e0 e sequenzialit\u00e0. Questo concetto \u00e8 stato dimostrato in questa <a href=\"https:\/\/github.com\/amusarra\/signature-chain-poc\">Proof of Concept (POC)<\/a> che utilizza PostgreSQL e <a href=\"https:\/\/www.codemotion.com\/magazine\/it\/backend-it\/top-10-piattaforme-online-per-fare-pratica-con-python\/\">Python<\/a>, impiegando chiavi RSA generate in memoria per illustrare il funzionamento. Per un ambiente di produzione reale, si raccomanda l&#8217;uso di Hardware Security Modules (HSM) o i key vault (sistemi di custodia certificati per chiavi crittografiche), una Timestamp Authority (TSA) per la certificazione temporale esatta (assicurando l&#8217;esatta data e ora di ogni sottoscrizione, fino al millisecondo, eliminando contestazioni temporali), e certificati digitali qualificati, rilasciati da enti certificatori riconosciuti. Pertanto, si sottolinea la natura non sperimentale ma robusta e legalmente valida di tale sistema per applicazioni reali.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"h-architettura-e-funzionamento\">Architettura e funzionamento<\/h2>\n\n\n\n<p>Il sistema di Signature Chain, implementato dalla PoC, si basa su un\u2019applicazione realizzata in Python che interagisce con un database per la memorizzazione e la verifica delle firme. Ogni firma apposta su un documento viene registrata come un <strong>&#8220;blocco&#8221;<\/strong> in una tabella del database, ad esempio <code>signature_chain<\/code>. Tale interazione \u00e8 assimilabile all&#8217;operato di un segretario altamente preciso e incorruttibile, il quale registra ogni singola sottoscrizione con meticolosit\u00e0, senza omissioni o possibilit\u00e0 di corruzione.<\/p>\n\n\n\n<p>Il diagramma a seguire illustra l&#8217;architettura del sistema implementata da questa PoC.<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"123\" src=\"https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2025\/05\/architettura-1024x123.png\" alt=\"\" class=\"wp-image-33155\" srcset=\"https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2025\/05\/architettura-1024x123.png 1024w, https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2025\/05\/architettura-300x36.png 300w, https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2025\/05\/architettura-768x92.png 768w, https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2025\/05\/architettura-1536x185.png 1536w, https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2025\/05\/architettura.png 1928w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<p>La struttura di ogni blocco \u00e8 progettata per garantire l\u2019integrit\u00e0 e la tracciabilit\u00e0. Ecco il design di ogni blocco che corrisponde al modello della tabella <code>signature_chain<\/code>.<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong><code>id<\/code><\/strong> (SERIAL PRIMARY KEY): Un identificativo progressivo unico per il blocco.<\/li>\n\n\n\n<li><strong><code>document_id<\/code><\/strong> (UUID): Un identificativo UUID che lega la catena di firme a uno specifico documento. Questo permette di avere catene separate per documenti diversi.<\/li>\n\n\n\n<li><strong><code>signer<\/code><\/strong> (VARCHAR(255)): Il nome o l&#8217;identificativo del firmatario.<\/li>\n\n\n\n<li><strong><code>document_hash<\/code><\/strong> (VARCHAR(64)): L&#8217;hash SHA-256 del contenuto originale del documento. Questo hash rimane costante per tutte le firme all&#8217;interno della stessa catena e dello stesso documento.<\/li>\n\n\n\n<li><strong><code>prev_hash<\/code><\/strong> (VARCHAR(128), NULLABLE): L&#8217;hash della firma (<code>signature<\/code>) del blocco precedente nella catena. Per il primo blocco, noto come <strong>&#8220;blocco genesi&#8221;<\/strong>, questo valore \u00e8 <code>NULL<\/code>.<\/li>\n\n\n\n<li><code><strong>chain_hash<\/strong><\/code> (TEXT, GENERATED ALWAYS AS STORED): <strong>Colonna Calcolata Automaticamente.<\/strong> Questa colonna contiene l&#8217;hash SHA-256 della concatenazione di <code>prev_hash<\/code> (o una stringa vuota se <code>prev_hash<\/code> \u00e8 <code>NULL<\/code>) e <code>document_hash<\/code> del blocco corrente. In pratica, rappresenta l&#8217;hash dei dati che vengono effettivamente firmati digitalmente per produrre il campo <code>signature<\/code>. Viene calcolata e memorizzata automaticamente dal database (<code>encode(digest(coalesce(prev_hash, '') || document_hash, 'sha256'), 'hex')<\/code>). Sebbene non sia utilizzata attivamente dallo script Python per la logica di costruzione o verifica della catena (che ricalcola questi dati in memoria), pu\u00f2 essere utile per query dirette al database, per debug, o per meccanismi di verifica alternativi a livello di database.<\/li>\n\n\n\n<li><strong><code>signature<\/code><\/strong> (VARCHAR(128)): La firma digitale RSA vera e propria. Viene calcolata firmando la concatenazione di <code>prev_hash<\/code> e <code>document_hash<\/code> del blocco corrente. Questo campo funge da hash crittografico del blocco corrente e diventa il <code>prev_hash<\/code> per il blocco successivo.<\/li>\n\n\n\n<li><strong><code>created_at<\/code><\/strong> (TIMESTAMP DEFAULT CURRENT_TIMESTAMP): Il timestamp di creazione del blocco.<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"h-esempio-di-record-nella-tabella\">Esempio di record nella tabella<\/h2>\n\n\n\n<p>Di seguito \u00e8 presentata un&#8217;illustrazione dei record all&#8217;interno della tabella <code>signature_chain<\/code>, con esempi concreti che dimostrano la correlazione tra i campi e la formazione della catena:<\/p>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"h-blocco-1-genesi-firmatario-antonio\">Blocco 1 (Genesi &#8211; Firmatario: Antonio)<\/h4>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><tbody><tr><td><strong>Campo<\/strong><\/td><td><strong>Valore<\/strong><\/td><td><strong>Descrizione<\/strong><\/td><\/tr><tr><td>id<\/td><td>1<\/td><td>L&#8217;identificativo del blocco, il primo in questa catena. Un semplice contatore, ma essenziale per l&#8217;ordinamento.<\/td><\/tr><tr><td>document_id<\/td><td>c4a7a134-8a02-4bad-bc9f-395f7f0f1a33<\/td><td>L&#8217;identificativo universale univoco del documento oggetto di firma. Questo UUID (Universally Unique Identifier) assicura la distinzione di questo documento da qualsiasi altro nel sistema.<\/td><\/tr><tr><td>signer<\/td><td>Antonio<\/td><td>L&#8217;identit\u00e0 del primo firmatario, chiaramente registrata.<\/td><\/tr><tr><td>document_hash<\/td><td>f2ca1bb6c7e907d06dafe4687e579fce76b37e4e93b7605022da52e6ccc26fd2<\/td><td>L&#8217;hash SHA-256 del documento originale. Questo valore rappresenta il &#8220;DNA&#8221; crittografico del documento, una stringa di 64 caratteri esadecimali che lo identifica in modo univoco. Qualsiasi modifica al documento comporterebbe un hash differente.<\/td><\/tr><tr><td>prev_hash<\/td><td>NULL<\/td><td>Poich\u00e9 si tratta del primo blocco, non esiste alcuna firma precedente a cui collegarsi, pertanto il valore \u00e8 nullo. Ci\u00f2 segnala l&#8217;inizio della catena.<\/td><\/tr><tr><td>signature<\/td><td>a3f5b1\u2026c72e<\/td><td>Firma RSA: concatenazione di una stringa vuota (prev_hash nullo) e hash documento, firmata da Antonio. Risultato: stringa esadecimale di 128 caratteri.<\/td><\/tr><tr><td>created_at<\/td><td>2025-05-21 14:30:00.123456+00<\/td><td>La data e l&#8217;ora precise di apposizione della firma da parte di Antonio, inclusi i microsecondi e il fuso orario UTC. Questo timestamp \u00e8 cruciale per la cronologia.<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"h-blocco-2-firmatario-marianna\">Blocco 2 (Firmatario: Marianna)<\/h4>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><tbody><tr><td><strong>Campo<\/strong><\/td><td><strong>Valore<\/strong><\/td><td><strong>Descrizione<\/strong><\/td><\/tr><tr><td>id<\/td><td>2<\/td><td>L&#8217;identificativo del blocco, il secondo in questa catena.<\/td><\/tr><tr><td>document_id<\/td><td>c4a7a134-8a02-4bad-bc9f-395f7f0f1a33<\/td><td>L&#8217;identificativo del documento rimane invariato, poich\u00e9 la firma si riferisce al medesimo file. Questo \u00e8 fondamentale per raggruppare tutte le firme relative a un unico documento.<\/td><\/tr><tr><td>signer<\/td><td>Marianna<\/td><td>L&#8217;identit\u00e0 del firmatario di questo blocco.<\/td><\/tr><tr><td>document_hash<\/td><td>f2ca1bb6c7e907d06dafe4687e579fce76b37e4e93b7605022da52e6ccc26fd2<\/td><td>L&#8217;hash del documento rimane lo stesso, a riprova che il documento non ha subito modifiche tra la firma di Antonio e quella di Marianna. Una discrepanza in questo hash invaliderebbe la catena.<\/td><\/tr><tr><td>prev_hash<\/td><td>a3f5b1\u2026c72e<\/td><td>Questo valore corrisponde alla <code>signature<\/code> di Antonio dal Blocco 1. Costituisce il legame crittografico al blocco precedente, garantendo la sequenzialit\u00e0. Questo \u00e8 l&#8217;elemento chiave della concatenazione.<\/td><\/tr><tr><td>signature<\/td><td>b8e0d9\u2026f4a1<\/td><td>Questa firma, calcolata sulla concatenazione della signature di Antonio e l\u2019hash del documento, \u00e8 unica per questo blocco e sequenza.<\/td><\/tr><tr><td>created_at<\/td><td>2025-05-21 14:35:00.654321+00<\/td><td>La data e l&#8217;ora precise di apposizione della firma da parte di Marianna. Si noti che \u00e8 successiva a quella di Antonio, confermando l&#8217;ordine cronologico.<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"h-schema-della-catena-delle-firme\">Schema della catena delle firme<\/h2>\n\n\n\n<p>Il diagramma seguente illustra come i blocchi sono concatenati:<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"704\" src=\"https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2025\/05\/schema_catena_firme-1024x704.png\" alt=\"\" class=\"wp-image-33156\" srcset=\"https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2025\/05\/schema_catena_firme-1024x704.png 1024w, https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2025\/05\/schema_catena_firme-300x206.png 300w, https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2025\/05\/schema_catena_firme-768x528.png 768w, https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2025\/05\/schema_catena_firme-1536x1056.png 1536w, https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2025\/05\/schema_catena_firme-2048x1408.png 2048w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<p>Questo schema garantisce che ogni blocco sia inscindibilmente legato al precedente, formando una catena di integrit\u00e0.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"h-meccanismi-di-sicurezza-in-postgresql-per-la-signature-chain\">Meccanismi di Sicurezza in PostgreSQL per la Signature Chain<\/h2>\n\n\n\n<p>PostgreSQL, come database relazionale robusto, offre diversi meccanismi di sicurezza che sono fondamentali per implementare e mantenere l&#8217;integrit\u00e0 e l&#8217;immutabilit\u00e0 dei dati in una Signature Chain. L&#8217;esempio fornito nello script <code>init.sql<\/code> illustra l&#8217;applicazione di alcuni di questi principi chiave:<\/p>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"h-1-principio-del-privilegio-minimo-least-privilege-principle\">1. Principio del Privilegio Minimo (Least Privilege Principle)<\/h4>\n\n\n\n<p>Questo principio di sicurezza fondamentale suggerisce che a un utente o a un&#8217;applicazione dovrebbero essere concessi solo i privilegi minimi necessari per svolgere le proprie funzioni. Nello script <code>init.sql<\/code>, questo \u00e8 implementato attraverso:<\/p>\n\n\n\n<p><strong>Creazione di un utente applicativo dedicato:<\/strong> <\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-1\" data-shcb-language-name=\"SQL (Structured Query Language)\" data-shcb-language-slug=\"sql\"><span><code class=\"hljs language-sql\">&lt;code&gt;<span class=\"hljs-keyword\">CREATE<\/span> <span class=\"hljs-keyword\">ROLE<\/span> app_user <span class=\"hljs-keyword\">WITH<\/span> LOGIN <span class=\"hljs-keyword\">PASSWORD<\/span> <span class=\"hljs-string\">'app_password'<\/span>;&lt;\/code&gt;<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-1\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">SQL (Structured Query Language)<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">sql<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p> Viene creato un ruolo specifico (<code>app_user<\/code>) per l&#8217;applicazione, separato dall&#8217;utente amministratore del database.<\/p>\n\n\n\n<p><strong>Concessione di privilegi limitati:<\/strong> <\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-2\" data-shcb-language-name=\"SQL (Structured Query Language)\" data-shcb-language-slug=\"sql\"><span><code class=\"hljs language-sql\">&lt;code&gt;<span class=\"hljs-keyword\">GRANT<\/span> <span class=\"hljs-keyword\">CONNECT<\/span> <span class=\"hljs-keyword\">ON<\/span> <span class=\"hljs-keyword\">DATABASE<\/span> signature_demo <span class=\"hljs-keyword\">TO<\/span> app_user;<span class=\"hljs-keyword\">GRANT<\/span> <span class=\"hljs-keyword\">USAGE<\/span> <span class=\"hljs-keyword\">ON<\/span> <span class=\"hljs-keyword\">SCHEMA<\/span> <span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-keyword\">TO<\/span> app_user;<span class=\"hljs-keyword\">GRANT<\/span> <span class=\"hljs-keyword\">SELECT<\/span>, <span class=\"hljs-keyword\">INSERT<\/span> <span class=\"hljs-keyword\">ON<\/span> signature_chain <span class=\"hljs-keyword\">TO<\/span> app_user;<span class=\"hljs-keyword\">GRANT<\/span> <span class=\"hljs-keyword\">USAGE<\/span> <span class=\"hljs-keyword\">ON<\/span> <span class=\"hljs-keyword\">SEQUENCE<\/span> signature_chain_id_seq <span class=\"hljs-keyword\">TO<\/span> app_user;&lt;\/code&gt;<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-2\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">SQL (Structured Query Language)<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">sql<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>A <code>app_user<\/code> vengono concessi solo i permessi di connessione al database, uso dello schema pubblico, e specificamente <code>SELECT<\/code> e <code>INSERT<\/code> sulla tabella <code>signature_chain<\/code>, oltre all&#8217;uso della sequenza ID. Notare l&#8217;assenza di permessi di <code>UPDATE<\/code> o <code>DELETE<\/code>, che \u00e8 cruciale per l&#8217;immutabilit\u00e0.<\/p>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"h-2-sicurezza-a-livello-di-riga-row-level-security-rls\">2. Sicurezza a Livello di Riga (Row Level Security &#8211; RLS)<\/h4>\n\n\n\n<p>La RLS in PostgreSQL permette di definire policy di sicurezza che controllano quali righe possono essere visualizzate o modificate da specifici utenti o ruoli, anche se questi utenti hanno permessi a livello di tabella. Questo aggiunge un ulteriore strato di controllo granulare. Nello script:<\/p>\n\n\n\n<p><strong>Abilitazione e forzatura di RLS:<\/strong><\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-3\" data-shcb-language-name=\"SQL (Structured Query Language)\" data-shcb-language-slug=\"sql\"><span><code class=\"hljs language-sql\"><span class=\"hljs-keyword\">ALTER<\/span> <span class=\"hljs-keyword\">TABLE<\/span> signature_chain <span class=\"hljs-keyword\">ENABLE<\/span> <span class=\"hljs-keyword\">ROW<\/span> <span class=\"hljs-keyword\">LEVEL<\/span> <span class=\"hljs-keyword\">SECURITY<\/span>;\n<span class=\"hljs-keyword\">ALTER<\/span> <span class=\"hljs-keyword\">TABLE<\/span> signature_chain <span class=\"hljs-keyword\">FORCE<\/span> <span class=\"hljs-keyword\">ROW<\/span> <span class=\"hljs-keyword\">LEVEL<\/span> <span class=\"hljs-keyword\">SECURITY<\/span>;<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-3\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">SQL (Structured Query Language)<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">sql<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>Questi comandi attivano la RLS per la tabella <code>signature_chain<\/code> e la forzano anche per il proprietario della tabella, garantendo che le policy siano sempre applicate.<\/p>\n\n\n\n<p><strong>Definizione delle policy di immutabilit\u00e0:<\/strong><\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-4\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php\">CREATE POLICY allow_inserts_for_public ON signature_chain \n<span class=\"hljs-keyword\">FOR<\/span> INSERT TO <span class=\"hljs-keyword\">PUBLIC<\/span> WITH CHECK (<span class=\"hljs-keyword\">true<\/span>);<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-4\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>Questa policy permette le operazioni di inserimento, essenziali per aggiungere nuove firme alla catena.<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-5\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php\">CREATE POLICY allow_select_for_public ON signature_chain \n<span class=\"hljs-keyword\">FOR<\/span> SELECT TO <span class=\"hljs-keyword\">PUBLIC<\/span> USING (<span class=\"hljs-keyword\">true<\/span>);<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-5\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>Questa policy consente la lettura di tutte le righe, necessaria per la verifica della catena.<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-6\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php\">CREATE POLICY no_updates_for_public ON signature_chain \n<span class=\"hljs-keyword\">FOR<\/span> UPDATE TO <span class=\"hljs-keyword\">PUBLIC<\/span> USING (<span class=\"hljs-keyword\">false<\/span>);<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-6\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>Questa policy <strong>impedisce esplicitamente qualsiasi operazione di aggiornamento<\/strong> sulla tabella per il ruolo <code>PUBLIC<\/code> (che include <code>app_user<\/code>).<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-7\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php\">CREATE POLICY no_deletes_for_public ON signature_chain \n<span class=\"hljs-keyword\">FOR<\/span> DELETE TO <span class=\"hljs-keyword\">PUBLIC<\/span> USING (<span class=\"hljs-keyword\">false<\/span>);<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-7\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>Analogamente, questa policy <strong>impedisce qualsiasi operazione di cancellazione<\/strong>.<\/p>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"h-3-revoca-esplicita-dei-permessi\">3. Revoca Esplicita dei Permessi<\/h4>\n\n\n\n<p>Come buona pratica di sicurezza, lo script include anche una revoca esplicita dei permessi di <code>UPDATE<\/code> e <code>DELETE<\/code> per <code>PUBLIC<\/code>:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-8\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php\">REVOKE UPDATE, DELETE ON signature_chain FROM <span class=\"hljs-keyword\">PUBLIC<\/span>;<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-8\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>Questa revoca rafforza ulteriormente le policy RLS, assicurando che nessun utente senza permessi specifici possa modificare o eliminare i dati della catena, anche se per qualche motivo le policy RLS non fossero attive o fossero mal configurate.<\/p>\n\n\n\n<p>Combinando il principio del privilegio minimo con la robustezza della Sicurezza a Livello di Riga, PostgreSQL fornisce un ambiente in cui l&#8217;immutabilit\u00e0 della Signature Chain \u00e8 fortemente rafforzata, rendendo estremamente difficile la manomissione dei record una volta che sono stati inseriti. Questo \u00e8 cruciale per la fiducia e la validit\u00e0 a lungo termine dei documenti firmati digitalmente.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"h-verifica-dell-integrita-del-documento-originale-considerazioni-esterne\">Verifica dell&#8217;integrit\u00e0 del documento originale (considerazioni esterne)<\/h2>\n\n\n\n<p>Oltre a garantire l&#8217;integrit\u00e0 interna della catena di firme, \u00e8 fondamentale verificare anche l&#8217;integrit\u00e0 del documento originale conservato esternamente. La Signature Chain valida le firme apposte su un documento con un <code>document_hash<\/code> specifico, ma non rileva modifiche al file sorgente nel suo repository esterno.<\/p>\n\n\n\n<p>Per una verifica completa, il processo dovrebbe includere passaggi aggiuntivi:<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>Recupero del Documento Attuale<\/strong>: utilizzando il <code>document_id<\/code> presente nella <code>signature_chain<\/code>, recuperare la versione corrente del documento dal suo sistema di archiviazione primario.<\/li>\n\n\n\n<li><strong>Calcolo dell&#8217;Hash Attuale<\/strong>: calcolare l&#8217;hash SHA-256 del documento recuperato al punto precedente.<\/li>\n\n\n\n<li><strong>Confronto Fondamentale<\/strong>: confrontare questo hash appena calcolato con il <code>document_hash<\/code> memorizzato nel primo blocco (o in qualsiasi blocco, dato che dovrebbe essere identico per tutti i blocchi relativi allo stesso <code>document_id<\/code>) della <code>signature_chain<\/code>.<\/li>\n<\/ol>\n\n\n\n<p>Se questi due hash non corrispondono, significa che il documento originale \u00e8 stato alterato o sostituito dopo l&#8217;inizio del processo di firma. L&#8217;implementazione di questa verifica richiede un&#8217;integrazione con il sistema di gestione documentale.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"h-caratteristiche-chiave-della-catena\">Caratteristiche chiave della catena<\/h2>\n\n\n\n<p>Le propriet\u00e0 fondamentali che rendono la Signature Chain una tecnologia preziosa sono:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Immutabilit\u00e0<\/strong>: una volta aggiunto, un blocco non pu\u00f2 essere modificato senza invalidare tutte le firme successive nella catena.<\/li>\n\n\n\n<li><strong>Integrit\u00e0 del Documento<\/strong>: il <code>document_hash<\/code> assicura che tutte le firme si riferiscano esattamente alla stessa versione del documento.<\/li>\n\n\n\n<li><strong>Sequenzialit\u00e0 Verificabile<\/strong>: il campo <code>prev_hash<\/code> stabilisce un legame cronologico inconfutabile tra le firme, garantendo l&#8217;ordine di apposizione.<\/li>\n\n\n\n<li><strong>Autenticit\u00e0 del Firmatario<\/strong>: ogni <code>signature<\/code> \u00e8 generata con la chiave privata del firmatario, permettendo la verifica dell&#8217;autenticit\u00e0 tramite la sua chiave pubblica.<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"h-come-avviare-la-poc\">Come avviare la PoC<\/h2>\n\n\n\n<p>Per avviare la Proof of Concept e sperimentare la Signature Chain, segui questi passaggi:<\/p>\n\n\n\n<h4 class=\"wp-block-heading\">1. Requisiti<\/h4>\n\n\n\n<p>Assicurati di avere installato:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><a href=\"https:\/\/podman.io\/\">Podman<\/a> (o Docker, con lievi modifiche ai comandi <code>podman-compose<\/code>)<\/li>\n\n\n\n<li>Python 3.9+<\/li>\n\n\n\n<li>Librerie Python: <code>psycopg2-binary<\/code>, <code>cryptography<\/code>.<\/li>\n<\/ul>\n\n\n\n<p>Installa le dipendenze Python:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-9\" data-shcb-language-name=\"CSS\" data-shcb-language-slug=\"css\"><span><code class=\"hljs language-css\"><span class=\"hljs-selector-tag\">pip<\/span> <span class=\"hljs-selector-tag\">install<\/span> <span class=\"hljs-selector-tag\">-r<\/span> <span class=\"hljs-selector-tag\">requirements<\/span><span class=\"hljs-selector-class\">.txt<\/span><\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-9\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">CSS<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">css<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>(Assicurati che <code>requirements.txt<\/code> contenga <code>psycopg2-binary<\/code> e <code>cryptography<\/code>)<\/p>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"h-2-configurazione-variabili-d-ambiente-opzionale\">2. Configurazione variabili d&#8217;ambiente (opzionale)<\/h4>\n\n\n\n<p>Lo script <code>main.py<\/code> pu\u00f2 essere configurato tramite variabili d&#8217;ambiente per i dettagli di connessione al database. Se non impostate, saranno usati valori di default.<\/p>\n\n\n\n<p>Esempio d&#8217;impostazione delle variabili di ambiente<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-10\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\"><span class=\"hljs-keyword\">export<\/span> APP_DB_USER=<span class=\"hljs-string\">\"mio_user_app\"<\/span>\n<span class=\"hljs-keyword\">export<\/span> APP_DB_PASSWORD=<span class=\"hljs-string\">\"mia_password_app\"<\/span>\n<span class=\"hljs-keyword\">export<\/span> SUPER_DB_USER=<span class=\"hljs-string\">\"postgres_admin\"<\/span>\n<span class=\"hljs-keyword\">export<\/span> SUPER_DB_PASSWORD=<span class=\"hljs-string\">\"admin_password\"<\/span>\n<span class=\"hljs-keyword\">export<\/span> DB_NAME=<span class=\"hljs-string\">\"poc_signatures\"<\/span>\n<span class=\"hljs-keyword\">export<\/span> DB_HOST=<span class=\"hljs-string\">\"localhost\"<\/span><\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-10\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>I valori di default sono rispettivamente: <code>app_user<\/code>, <code>app_password<\/code>, <code>postgres<\/code>, <code>postgres<\/code>, <code>signature_demo<\/code>, <code>localhost<\/code>.<\/p>\n\n\n\n<h4 class=\"wp-block-heading\">3. Avvio del database PostgreSQL<\/h4>\n\n\n\n<p>Viene fornito un file <code>podman-compose.yml<\/code> per avviare un&#8217;istanza di PostgreSQL con gli utenti e il database necessari pre-configurati. Esegui il seguente comando dalla directory del progetto:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-11\" data-shcb-language-name=\"CSS\" data-shcb-language-slug=\"css\"><span><code class=\"hljs language-css\"><span class=\"hljs-selector-tag\">podman-compose<\/span> <span class=\"hljs-selector-tag\">-f<\/span> <span class=\"hljs-selector-tag\">podman-compose<\/span><span class=\"hljs-selector-class\">.yml<\/span> <span class=\"hljs-selector-tag\">up<\/span> <span class=\"hljs-selector-tag\">-d<\/span><\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-11\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">CSS<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">css<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>Il comando precedente:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Avvia un container PostgreSQL.<\/li>\n\n\n\n<li>Crea il database specificato (default: <code>signature_demo<\/code>).<\/li>\n\n\n\n<li>Crea gli utenti <code>app_user<\/code> (con permessi limitati) e <code>postgres<\/code> (superutente).<\/li>\n\n\n\n<li>Esegue lo script <code>init.sql<\/code> per creare la tabella <code>signature_chain<\/code> e impostare i permessi e la Row-Level Security (RLS) per <code>app_user<\/code>.<\/li>\n\n\n\n<li>Espone la porta <code>5432<\/code> del database sull&#8217;host.<\/li>\n<\/ul>\n\n\n\n<h4 class=\"wp-block-heading\">4. Esegui lo script di firma e verifica<\/h4>\n\n\n\n<p>Lo script <code>main.py<\/code> simula i seguenti scenari:<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>Scenario Utente Applicativo (<code>app_user<\/code>)<\/strong>:\n<ul class=\"wp-block-list\">\n<li>Connessione al DB come <code>app_user<\/code>.<\/li>\n\n\n\n<li>Inserimento di una sequenza di firme da parte di diversi firmatari (Antonio, Marianna, Claudio) sullo stesso documento.<\/li>\n\n\n\n<li>Verifica dell&#8217;integrit\u00e0 della catena.<\/li>\n\n\n\n<li>Tentativo (fallito, grazie a RLS e GRANT) di manomettere un record esistente da parte di <code>app_user<\/code>.<\/li>\n\n\n\n<li>Nuova verifica della catena.<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li><strong>Scenario Utente Privilegiato (<code>super_db_user<\/code>, default: <code>postgres<\/code>)<\/strong>:\n<ul class=\"wp-block-list\">\n<li>Pulizia della tabella.<\/li>\n\n\n\n<li>Connessione al DB come utente con privilegi elevati.<\/li>\n\n\n\n<li>Reinserimento della sequenza di firme.<\/li>\n\n\n\n<li>Verifica dell&#8217;integrit\u00e0 della catena.<\/li>\n\n\n\n<li>Tentativo (riuscito) di manomettere un record esistente da parte del superutente.<\/li>\n\n\n\n<li>Nuova verifica della catena, che <strong>dovrebbe fallire<\/strong>, evidenziando la manomissione.<\/li>\n<\/ul>\n<\/li>\n<\/ol>\n\n\n\n<p>Per verificare gli scenari sopra descritti, esegui lo script con il comando <code>python main.py<\/code><\/p>\n\n\n\n<h4 class=\"wp-block-heading\">5. Verifica della Catena<\/h4>\n\n\n\n<p>La funzione <code>verify_chain<\/code> esegue il processo di verifica come illustrato nel seguente diagramma di sequenza:<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"704\" src=\"https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2025\/05\/sequence_diagram_verifica_catena-1024x704.png\" alt=\"\" class=\"wp-image-33158\" srcset=\"https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2025\/05\/sequence_diagram_verifica_catena-1024x704.png 1024w, https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2025\/05\/sequence_diagram_verifica_catena-300x206.png 300w, https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2025\/05\/sequence_diagram_verifica_catena-768x528.png 768w, https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2025\/05\/sequence_diagram_verifica_catena-1536x1056.png 1536w, https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2025\/05\/sequence_diagram_verifica_catena-2048x1408.png 2048w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<p>In sintesi:<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>Recupera tutti i record dalla tabella <code>signature_chain<\/code> in ordine di ID.<\/li>\n\n\n\n<li>Per ogni record: \n<ul class=\"wp-block-list\">\n<li>Controlla che <code>prev_hash<\/code> corrisponda alla <code>signature<\/code> del record precedente (a meno che non sia il blocco genesi, dove <code>prev_hash<\/code> deve essere <code>NULL<\/code>). <\/li>\n\n\n\n<li>Ricostruisce i dati che sono stati originariamente firmati: <code>(prev_hash || document_hash)<\/code>.<\/li>\n\n\n\n<li>Verifica la <code>signature<\/code> del record corrente usando i dati ricostruiti e la chiave pubblica del <code>signer<\/code> associato a quel record.<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li>Se una qualsiasi di queste verifiche fallisce, l&#8217;intera catena \u00e8 considerata compromessa.<\/li>\n<\/ol>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"h-output-atteso-estratto\">Output atteso (estratto)<\/h3>\n\n\n\n<p>L&#8217;output sar\u00e0 colorato e includer\u00e0 emoji per indicare lo stato delle operazioni. Un esempio parziale:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-12\" data-shcb-language-name=\"HTML, XML\" data-shcb-language-slug=\"xml\"><span><code class=\"hljs language-xml\">\ud83d\udcbe Tentativo di pulire la tabella signature_chain come utente 'postgres'...\n\u2705 Tabella signature_chain pulita con successo.\n\n===== SCENARIO 1: Utente Applicativo (app_user) =====\n\ud83d\udcbe Tentativo di connessione al database 'signature_demo' come utente 'app_user'...\n\u2705 Connessione come app_user riuscita.\n\n\ud83d\udd17==== Sequenza Firme Inserite nella Catena ====\n\u2139\ufe0f Documento Originale: \"Contenuto documento firmato da pi\u00f9 persone\"\n\u2139\ufe0f Hash Documento Originale: <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">hash_del_documento<\/span>&gt;<\/span>\n----------------------------------------------------------------------\n\ud83e\uddf1 ID Blocco: 1\n  Firmatario: Antonio\n  Hash Documento Firmato: <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">hash_del_documento<\/span>&gt;<\/span>\n  Hash Catena Precedente: N\/A (Blocco Genesi)\n  Hash Catena Corrente (Firma del Blocco): <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">signature_blocco_1<\/span>&gt;<\/span>...\n----------------------------------------------------------------------\n\ud83e\uddf1 ID Blocco: 2\n  Firmatario: Marianna\n  Hash Documento Firmato: <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">hash_del_documento<\/span>&gt;<\/span>\n  Hash Catena Precedente: <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">signature_blocco_1<\/span>&gt;<\/span>\n  Hash Catena Corrente (Firma del Blocco): <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">signature_blocco_2<\/span>&gt;<\/span>...\n----------------------------------------------------------------------\n... (altre firme e output di verifica) ...\n\n\ud83d\udd17==== Verifica Integrit\u00e0 Catena Firme (Contesto: app_user - Post Inserimento) ====\n...\n\u2705 La catena delle firme \u00e8 VALIDA. Integrit\u00e0 CONFERMATA. \u2705\n----------------------------------------------------------------------\n\n\u26a0\ufe0f---- 1.2 Tentativo di Manomissione UPDATE (come app_user) ----\n\u2139\ufe0f Tentativo di UPDATE del document_hash del blocco ID: 2 (Firmatario: Marianna) come 'app_user'.\n\u2705 SUCCESSO: Tentativo di UPDATE BLOCCATO dal DB per 'app_user' come previsto!\n  \u2139\ufe0f Errore DB (SQLSTATE 42501): permission denied for table signature_chain\n... (output scenario superuser con manomissione e fallimento verifica crittografica) ...\n\n\ud83c\udfc1Fine della dimostrazione.<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-12\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">HTML, XML<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">xml<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>Questo output guida l&#8217;utente attraverso le fasi della dimostrazione, evidenziando i successi (<code>\u2705<\/code>) e i fallimenti (<code>\u26a0\ufe0f<\/code>) in modo chiaro. Si osserver\u00e0 come il database blocchi i tentativi di manomissione da parte dell&#8217;utente con permessi limitati (grazie alla RLS!), e come il meccanismo di verifica della catena rilevi le alterazioni qualora un super utente riesca a modificarla (poich\u00e9 la crittografia, per sua natura, non ammette falsificazioni!).<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"h-appendice-considerazioni-sugli-algoritmi-crittografici\">Appendice: considerazioni sugli algoritmi crittografici<\/h2>\n\n\n\n<p>In questa Proof of Concept (PoC), sono stati utilizzati i seguenti algoritmi crittografici:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Algoritmo di Hash:<\/strong> SHA-256<\/li>\n\n\n\n<li><strong>Algoritmo di Firma Digitale:<\/strong> RSA con chiavi a 2048 bit (padding PKCS1v15)<\/li>\n<\/ul>\n\n\n\n<p>Queste scelte rappresentano una base solida e ampiamente compatibile per molte applicazioni. Tuttavia, a seconda dei requisiti specifici di sicurezza, prestazioni e longevit\u00e0 del sistema, \u00e8 possibile e spesso consigliabile considerare algoritmi pi\u00f9 robusti o differenti.<\/p>\n\n\n\n<h4 class=\"wp-block-heading\">Alternative per l&#8217;Hashing<\/h4>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>SHA-512:<\/strong> Parte della famiglia SHA-2, produce un hash di 512 bit, offrendo una maggiore resistenza teorica alle collisioni rispetto a SHA-256. Pu\u00f2 essere pi\u00f9 performante su architetture a 64 bit.<\/li>\n\n\n\n<li><strong>SHA-3 (es. SHA3-256, SHA3-512):<\/strong> Uno standard pi\u00f9 recente con un design interno diverso da SHA-2, considerato molto sicuro.<\/li>\n\n\n\n<li><strong>BLAKE2\/BLAKE3:<\/strong> Algoritmi moderni noti per l&#8217;alta velocit\u00e0 e sicurezza. BLAKE3 \u00e8 particolarmente efficiente e parallelizzabile.<\/li>\n<\/ul>\n\n\n\n<h4 class=\"wp-block-heading\">Alternative per la Firma Digitale<\/h4>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>RSA con chiavi pi\u00f9 lunghe (es. 3072 o 4096 bit):<\/strong> Aumentare la lunghezza della chiave RSA ne incrementa la robustezza contro attacchi computazionali. RSA 2048 bit \u00e8 generalmente sicuro, ma per requisiti di sicurezza pi\u00f9 elevati o per una protezione a pi\u00f9 lungo termine, chiavi pi\u00f9 lunghe sono preferibili. Questo comporta un aumento del carico computazionale.<\/li>\n\n\n\n<li><strong>Elliptic Curve Cryptography (ECC):<\/strong>\n<ul class=\"wp-block-list\">\n<li><strong>ECDSA (Elliptic Curve Digital Signature Algorithm):<\/strong> Offre un livello di sicurezza paragonabile a RSA ma con chiavi significativamente pi\u00f9 corte (es. una chiave ECC a 256 bit equivale circa a una RSA a 3072 bit). Questo si traduce in chiavi pi\u00f9 piccole e operazioni di firma\/verifica potenzialmente pi\u00f9 veloci. Curve comuni includono <code>P-256<\/code> (NIST), <code>P-384<\/code>, <code>P-521<\/code>.<\/li>\n\n\n\n<li><strong>EdDSA (Edwards-curve Digital Signature Algorithm, es. Ed25519):<\/strong> Un altro schema di firma basato su curve ellittiche, apprezzato per la sua sicurezza e per essere meno suscettibile a errori di implementazione rispetto a ECDSA.<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n\n\n\n<h4 class=\"wp-block-heading\">Fattori da Considerare per la Scelta<\/h4>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>Livello di Sicurezza Richiesto:<\/strong> Valutare la sensibilit\u00e0 dei dati e il periodo per cui la sicurezza deve essere garantita.<\/li>\n\n\n\n<li><strong>Prestazioni:<\/strong> Algoritmi pi\u00f9 complessi o con chiavi pi\u00f9 lunghe possono avere un impatto sulle prestazioni. ECC\/EdDSA spesso offrono un buon bilanciamento.<\/li>\n\n\n\n<li><strong>Compatibilit\u00e0 e Standard:<\/strong> Considerare gli standard di settore, le normative applicabili e la compatibilit\u00e0 con gli altri sistemi.<\/li>\n\n\n\n<li><strong>Supporto delle Librerie:<\/strong> Verificare che le librerie crittografiche utilizzate (come <code>cryptography<\/code> in Python) supportino pienamente gli algoritmi scelti.<\/li>\n\n\n\n<li><strong>Resistenza Quantistica:<\/strong> \u00c8 importante notare che gli algoritmi classici come RSA, ECC, SHA-2 e SHA-3 non sono considerati resistenti ad attacchi da parte di computer quantistici su larga scala. La crittografia post-quantistica (PQC) \u00e8 un campo di ricerca attivo per affrontare questa futura minaccia. Per sistemi che richiedono una sicurezza a lunghissimo termine, monitorare gli sviluppi in PQC \u00e8 fondamentale.<\/li>\n<\/ol>\n\n\n\n<p>La scelta degli algoritmi crittografici \u00e8 una decisione critica che dovrebbe essere basata su un&#8217;attenta analisi dei rischi e dei requisiti specifici del progetto.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Conclusioni<\/h2>\n\n\n\n<p>La Signature Chain offre una soluzione potente per garantire autenticit\u00e0, integrit\u00e0 e sequenzialit\u00e0 nei documenti digitali. Attraverso la crittografia e una struttura a catena immutabile, garantisce l\u2019integrit\u00e0 dei documenti e la verificabilit\u00e0 delle firme.<\/p>\n\n\n\n<p>La Proof of Concept, sebbene semplificata con chiavi RSA in memoria, dimostra il potenziale di questa tecnologia. L\u2019integrazione con HSM, key vault, Timestamp Authority e certificati validi ne eleva la sicurezza, rendendola essenziale per sistemi ad alta affidabilit\u00e0.<\/p>\n\n\n\n<p>In un panorama digitale in continua evoluzione, la Signature Chain \u00e8 uno strumento fondamentale per costruire fiducia e trasparenza nei flussi di lavoro documentali. La sua traccia di audit e crittograficamente sicura la rende indispensabile per settori come finanza, pubblica amministrazione, sanit\u00e0 e legale. La ricerca sulla resistenza quantistica sar\u00e0 cruciale per garantirne la longevit\u00e0.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Nell&#8217;era digitale, la gestione sicura e affidabile dei documenti \u00e8 una sfida cruciale. Assicurare che un documento non sia stato alterato e che le firme apposte siano autentiche e in una sequenza specifica \u00e8 fondamentale per processi legali, finanziari e amministrativi. L&#8217;obiettivo dell&#8217;articolo si propone di illustrare la Signature Chain come soluzione per la sicurezza&#8230; <a class=\"more-link\" href=\"https:\/\/www.codemotion.com\/magazine\/it\/backend-it\/la-signature-chain-garanzia-di-autenticita-integrita-e-sequenzialita-nei-documenti-digitali\/\">Read more<\/a><\/p>\n","protected":false},"author":299,"featured_media":33159,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_editorskit_title_hidden":false,"_editorskit_reading_time":0,"_editorskit_is_block_options_detached":false,"_editorskit_block_options_position":"{}","_uag_custom_page_level_css":"","_genesis_hide_title":false,"_genesis_hide_breadcrumbs":false,"_genesis_hide_singular_image":false,"_genesis_hide_footer_widgets":false,"_genesis_custom_body_class":"","_genesis_custom_post_class":"","_genesis_layout":"","footnotes":""},"categories":[10263],"tags":[13330,10438],"collections":[11708],"class_list":{"0":"post-33089","1":"post","2":"type-post","3":"status-publish","4":"format-standard","5":"has-post-thumbnail","7":"category-backend-it","8":"tag-architettura-software","9":"tag-sviluppo-software-it","10":"collections-dalla-community","11":"entry"},"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v26.9 (Yoast SEO v26.9) - https:\/\/yoast.com\/product\/yoast-seo-premium-wordpress\/ -->\n<title>La signature chain: garanzia di autenticit\u00e0 nei documenti digitali<\/title>\n<meta name=\"description\" content=\"Scopri come la Signature Chain pu\u00f2 garantire la sicurezza dei documenti digitali, proteggendo l&#039;integrit\u00e0 delle firme e la sequenzialit\u00e0 delle apposizioni.\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.codemotion.com\/magazine\/it\/backend-it\/la-signature-chain-garanzia-di-autenticita-integrita-e-sequenzialita-nei-documenti-digitali\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"La signature chain: garanzia di autenticit\u00e0, integrit\u00e0 e sequenzialit\u00e0 nei documenti digitali\" \/>\n<meta property=\"og:description\" content=\"Scopri come la Signature Chain pu\u00f2 garantire la sicurezza dei documenti digitali, proteggendo l&#039;integrit\u00e0 delle firme e la sequenzialit\u00e0 delle apposizioni.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.codemotion.com\/magazine\/it\/backend-it\/la-signature-chain-garanzia-di-autenticita-integrita-e-sequenzialita-nei-documenti-digitali\/\" \/>\n<meta property=\"og:site_name\" content=\"Codemotion Magazine\" \/>\n<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/Codemotion.Italy\/\" \/>\n<meta property=\"article:published_time\" content=\"2025-06-03T08:00:00+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2025-06-03T14:32:31+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2025\/05\/DALL\u00b7E-2025-05-26-11.47.27-A-horizontal-image-of-a-programmer-working-at-their-desk.-The-scene-is-set-in-a-modern-office-with-large-windows-showing-a-cityscape-outside-during-th.webp\" \/>\n\t<meta property=\"og:image:width\" content=\"1792\" \/>\n\t<meta property=\"og:image:height\" content=\"1024\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/webp\" \/>\n<meta name=\"author\" content=\"Antonio Musarra\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:creator\" content=\"@CodemotionIT\" \/>\n<meta name=\"twitter:site\" content=\"@CodemotionIT\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Antonio Musarra\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"13 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/www.codemotion.com\/magazine\/it\/backend-it\/la-signature-chain-garanzia-di-autenticita-integrita-e-sequenzialita-nei-documenti-digitali\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/www.codemotion.com\/magazine\/it\/backend-it\/la-signature-chain-garanzia-di-autenticita-integrita-e-sequenzialita-nei-documenti-digitali\/\"},\"author\":{\"name\":\"Antonio Musarra\",\"@id\":\"https:\/\/www.codemotion.com\/magazine\/#\/schema\/person\/8649554e10cf6f48891694be1891475b\"},\"headline\":\"La signature chain: garanzia di autenticit\u00e0, integrit\u00e0 e sequenzialit\u00e0 nei documenti digitali\",\"datePublished\":\"2025-06-03T08:00:00+00:00\",\"dateModified\":\"2025-06-03T14:32:31+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/www.codemotion.com\/magazine\/it\/backend-it\/la-signature-chain-garanzia-di-autenticita-integrita-e-sequenzialita-nei-documenti-digitali\/\"},\"wordCount\":2678,\"publisher\":{\"@id\":\"https:\/\/www.codemotion.com\/magazine\/#organization\"},\"image\":{\"@id\":\"https:\/\/www.codemotion.com\/magazine\/it\/backend-it\/la-signature-chain-garanzia-di-autenticita-integrita-e-sequenzialita-nei-documenti-digitali\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2025\/05\/DALL\u00b7E-2025-05-26-11.47.27-A-horizontal-image-of-a-programmer-working-at-their-desk.-The-scene-is-set-in-a-modern-office-with-large-windows-showing-a-cityscape-outside-during-th.webp\",\"keywords\":[\"architettura software\",\"sviluppo software\"],\"articleSection\":[\"Backend\"],\"inLanguage\":\"en-US\"},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/www.codemotion.com\/magazine\/it\/backend-it\/la-signature-chain-garanzia-di-autenticita-integrita-e-sequenzialita-nei-documenti-digitali\/\",\"url\":\"https:\/\/www.codemotion.com\/magazine\/it\/backend-it\/la-signature-chain-garanzia-di-autenticita-integrita-e-sequenzialita-nei-documenti-digitali\/\",\"name\":\"La signature chain: garanzia di autenticit\u00e0 nei documenti digitali\",\"isPartOf\":{\"@id\":\"https:\/\/www.codemotion.com\/magazine\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/www.codemotion.com\/magazine\/it\/backend-it\/la-signature-chain-garanzia-di-autenticita-integrita-e-sequenzialita-nei-documenti-digitali\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/www.codemotion.com\/magazine\/it\/backend-it\/la-signature-chain-garanzia-di-autenticita-integrita-e-sequenzialita-nei-documenti-digitali\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2025\/05\/DALL\u00b7E-2025-05-26-11.47.27-A-horizontal-image-of-a-programmer-working-at-their-desk.-The-scene-is-set-in-a-modern-office-with-large-windows-showing-a-cityscape-outside-during-th.webp\",\"datePublished\":\"2025-06-03T08:00:00+00:00\",\"dateModified\":\"2025-06-03T14:32:31+00:00\",\"description\":\"Scopri come la Signature Chain pu\u00f2 garantire la sicurezza dei documenti digitali, proteggendo l'integrit\u00e0 delle firme e la sequenzialit\u00e0 delle apposizioni.\",\"breadcrumb\":{\"@id\":\"https:\/\/www.codemotion.com\/magazine\/it\/backend-it\/la-signature-chain-garanzia-di-autenticita-integrita-e-sequenzialita-nei-documenti-digitali\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/www.codemotion.com\/magazine\/it\/backend-it\/la-signature-chain-garanzia-di-autenticita-integrita-e-sequenzialita-nei-documenti-digitali\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/www.codemotion.com\/magazine\/it\/backend-it\/la-signature-chain-garanzia-di-autenticita-integrita-e-sequenzialita-nei-documenti-digitali\/#primaryimage\",\"url\":\"https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2025\/05\/DALL\u00b7E-2025-05-26-11.47.27-A-horizontal-image-of-a-programmer-working-at-their-desk.-The-scene-is-set-in-a-modern-office-with-large-windows-showing-a-cityscape-outside-during-th.webp\",\"contentUrl\":\"https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2025\/05\/DALL\u00b7E-2025-05-26-11.47.27-A-horizontal-image-of-a-programmer-working-at-their-desk.-The-scene-is-set-in-a-modern-office-with-large-windows-showing-a-cityscape-outside-during-th.webp\",\"width\":1792,\"height\":1024},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/www.codemotion.com\/magazine\/it\/backend-it\/la-signature-chain-garanzia-di-autenticita-integrita-e-sequenzialita-nei-documenti-digitali\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/www.codemotion.com\/magazine\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Backend\",\"item\":\"https:\/\/www.codemotion.com\/magazine\/it\/backend-it\/\"},{\"@type\":\"ListItem\",\"position\":3,\"name\":\"La signature chain: garanzia di autenticit\u00e0, integrit\u00e0 e sequenzialit\u00e0 nei documenti digitali\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/www.codemotion.com\/magazine\/#website\",\"url\":\"https:\/\/www.codemotion.com\/magazine\/\",\"name\":\"Codemotion Magazine\",\"description\":\"We code the future. Together\",\"publisher\":{\"@id\":\"https:\/\/www.codemotion.com\/magazine\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/www.codemotion.com\/magazine\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":\"Organization\",\"@id\":\"https:\/\/www.codemotion.com\/magazine\/#organization\",\"name\":\"Codemotion\",\"url\":\"https:\/\/www.codemotion.com\/magazine\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/www.codemotion.com\/magazine\/#\/schema\/logo\/image\/\",\"url\":\"https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2019\/11\/codemotionlogo.png\",\"contentUrl\":\"https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2019\/11\/codemotionlogo.png\",\"width\":225,\"height\":225,\"caption\":\"Codemotion\"},\"image\":{\"@id\":\"https:\/\/www.codemotion.com\/magazine\/#\/schema\/logo\/image\/\"},\"sameAs\":[\"https:\/\/www.facebook.com\/Codemotion.Italy\/\",\"https:\/\/x.com\/CodemotionIT\"]},{\"@type\":\"Person\",\"@id\":\"https:\/\/www.codemotion.com\/magazine\/#\/schema\/person\/8649554e10cf6f48891694be1891475b\",\"name\":\"Antonio Musarra\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/www.codemotion.com\/magazine\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/68ceae8da379c8b4cdbe4d25ad5d94f7678e91e07cee64593261baec2ec44a12?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/68ceae8da379c8b4cdbe4d25ad5d94f7678e91e07cee64593261baec2ec44a12?s=96&d=mm&r=g\",\"caption\":\"Antonio Musarra\"},\"description\":\"Ho iniziato il mio viaggio nel mondo dell'informatica da un Olivetti M24 dotato di un processore Intel 8086 acquistato da mio padre esclusivamente per il suo lavoro. Non ho mai posseduto console di nessun genere (Commodore, Amiga, etc\u2026) e inizialmente quell'enorme scatola mi terrorizzava, terrore durato poco; giorno dopo giorno prendevo rapidamente il controllo fino a quando\u2026. Ho sempre creduto che la condivisione della conoscenza sia un ottimo mezzo per la crescita personale; mi piace condividere le mie competenze attraverso articoli tecnici, progetti open source e pubblicazioni su piattaforme come il mio blog personale https:\/\/www.dontesta.it.\",\"sameAs\":[\"https:\/\/www.dontesta.it\"],\"url\":\"https:\/\/www.codemotion.com\/magazine\/author\/amusarra\/\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"La signature chain: garanzia di autenticit\u00e0 nei documenti digitali","description":"Scopri come la Signature Chain pu\u00f2 garantire la sicurezza dei documenti digitali, proteggendo l'integrit\u00e0 delle firme e la sequenzialit\u00e0 delle apposizioni.","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/www.codemotion.com\/magazine\/it\/backend-it\/la-signature-chain-garanzia-di-autenticita-integrita-e-sequenzialita-nei-documenti-digitali\/","og_locale":"en_US","og_type":"article","og_title":"La signature chain: garanzia di autenticit\u00e0, integrit\u00e0 e sequenzialit\u00e0 nei documenti digitali","og_description":"Scopri come la Signature Chain pu\u00f2 garantire la sicurezza dei documenti digitali, proteggendo l'integrit\u00e0 delle firme e la sequenzialit\u00e0 delle apposizioni.","og_url":"https:\/\/www.codemotion.com\/magazine\/it\/backend-it\/la-signature-chain-garanzia-di-autenticita-integrita-e-sequenzialita-nei-documenti-digitali\/","og_site_name":"Codemotion Magazine","article_publisher":"https:\/\/www.facebook.com\/Codemotion.Italy\/","article_published_time":"2025-06-03T08:00:00+00:00","article_modified_time":"2025-06-03T14:32:31+00:00","og_image":[{"width":1792,"height":1024,"url":"https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2025\/05\/DALL\u00b7E-2025-05-26-11.47.27-A-horizontal-image-of-a-programmer-working-at-their-desk.-The-scene-is-set-in-a-modern-office-with-large-windows-showing-a-cityscape-outside-during-th.webp","type":"image\/webp"}],"author":"Antonio Musarra","twitter_card":"summary_large_image","twitter_creator":"@CodemotionIT","twitter_site":"@CodemotionIT","twitter_misc":{"Written by":"Antonio Musarra","Est. reading time":"13 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.codemotion.com\/magazine\/it\/backend-it\/la-signature-chain-garanzia-di-autenticita-integrita-e-sequenzialita-nei-documenti-digitali\/#article","isPartOf":{"@id":"https:\/\/www.codemotion.com\/magazine\/it\/backend-it\/la-signature-chain-garanzia-di-autenticita-integrita-e-sequenzialita-nei-documenti-digitali\/"},"author":{"name":"Antonio Musarra","@id":"https:\/\/www.codemotion.com\/magazine\/#\/schema\/person\/8649554e10cf6f48891694be1891475b"},"headline":"La signature chain: garanzia di autenticit\u00e0, integrit\u00e0 e sequenzialit\u00e0 nei documenti digitali","datePublished":"2025-06-03T08:00:00+00:00","dateModified":"2025-06-03T14:32:31+00:00","mainEntityOfPage":{"@id":"https:\/\/www.codemotion.com\/magazine\/it\/backend-it\/la-signature-chain-garanzia-di-autenticita-integrita-e-sequenzialita-nei-documenti-digitali\/"},"wordCount":2678,"publisher":{"@id":"https:\/\/www.codemotion.com\/magazine\/#organization"},"image":{"@id":"https:\/\/www.codemotion.com\/magazine\/it\/backend-it\/la-signature-chain-garanzia-di-autenticita-integrita-e-sequenzialita-nei-documenti-digitali\/#primaryimage"},"thumbnailUrl":"https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2025\/05\/DALL\u00b7E-2025-05-26-11.47.27-A-horizontal-image-of-a-programmer-working-at-their-desk.-The-scene-is-set-in-a-modern-office-with-large-windows-showing-a-cityscape-outside-during-th.webp","keywords":["architettura software","sviluppo software"],"articleSection":["Backend"],"inLanguage":"en-US"},{"@type":"WebPage","@id":"https:\/\/www.codemotion.com\/magazine\/it\/backend-it\/la-signature-chain-garanzia-di-autenticita-integrita-e-sequenzialita-nei-documenti-digitali\/","url":"https:\/\/www.codemotion.com\/magazine\/it\/backend-it\/la-signature-chain-garanzia-di-autenticita-integrita-e-sequenzialita-nei-documenti-digitali\/","name":"La signature chain: garanzia di autenticit\u00e0 nei documenti digitali","isPartOf":{"@id":"https:\/\/www.codemotion.com\/magazine\/#website"},"primaryImageOfPage":{"@id":"https:\/\/www.codemotion.com\/magazine\/it\/backend-it\/la-signature-chain-garanzia-di-autenticita-integrita-e-sequenzialita-nei-documenti-digitali\/#primaryimage"},"image":{"@id":"https:\/\/www.codemotion.com\/magazine\/it\/backend-it\/la-signature-chain-garanzia-di-autenticita-integrita-e-sequenzialita-nei-documenti-digitali\/#primaryimage"},"thumbnailUrl":"https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2025\/05\/DALL\u00b7E-2025-05-26-11.47.27-A-horizontal-image-of-a-programmer-working-at-their-desk.-The-scene-is-set-in-a-modern-office-with-large-windows-showing-a-cityscape-outside-during-th.webp","datePublished":"2025-06-03T08:00:00+00:00","dateModified":"2025-06-03T14:32:31+00:00","description":"Scopri come la Signature Chain pu\u00f2 garantire la sicurezza dei documenti digitali, proteggendo l'integrit\u00e0 delle firme e la sequenzialit\u00e0 delle apposizioni.","breadcrumb":{"@id":"https:\/\/www.codemotion.com\/magazine\/it\/backend-it\/la-signature-chain-garanzia-di-autenticita-integrita-e-sequenzialita-nei-documenti-digitali\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.codemotion.com\/magazine\/it\/backend-it\/la-signature-chain-garanzia-di-autenticita-integrita-e-sequenzialita-nei-documenti-digitali\/"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.codemotion.com\/magazine\/it\/backend-it\/la-signature-chain-garanzia-di-autenticita-integrita-e-sequenzialita-nei-documenti-digitali\/#primaryimage","url":"https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2025\/05\/DALL\u00b7E-2025-05-26-11.47.27-A-horizontal-image-of-a-programmer-working-at-their-desk.-The-scene-is-set-in-a-modern-office-with-large-windows-showing-a-cityscape-outside-during-th.webp","contentUrl":"https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2025\/05\/DALL\u00b7E-2025-05-26-11.47.27-A-horizontal-image-of-a-programmer-working-at-their-desk.-The-scene-is-set-in-a-modern-office-with-large-windows-showing-a-cityscape-outside-during-th.webp","width":1792,"height":1024},{"@type":"BreadcrumbList","@id":"https:\/\/www.codemotion.com\/magazine\/it\/backend-it\/la-signature-chain-garanzia-di-autenticita-integrita-e-sequenzialita-nei-documenti-digitali\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.codemotion.com\/magazine\/"},{"@type":"ListItem","position":2,"name":"Backend","item":"https:\/\/www.codemotion.com\/magazine\/it\/backend-it\/"},{"@type":"ListItem","position":3,"name":"La signature chain: garanzia di autenticit\u00e0, integrit\u00e0 e sequenzialit\u00e0 nei documenti digitali"}]},{"@type":"WebSite","@id":"https:\/\/www.codemotion.com\/magazine\/#website","url":"https:\/\/www.codemotion.com\/magazine\/","name":"Codemotion Magazine","description":"We code the future. Together","publisher":{"@id":"https:\/\/www.codemotion.com\/magazine\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.codemotion.com\/magazine\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":"Organization","@id":"https:\/\/www.codemotion.com\/magazine\/#organization","name":"Codemotion","url":"https:\/\/www.codemotion.com\/magazine\/","logo":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.codemotion.com\/magazine\/#\/schema\/logo\/image\/","url":"https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2019\/11\/codemotionlogo.png","contentUrl":"https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2019\/11\/codemotionlogo.png","width":225,"height":225,"caption":"Codemotion"},"image":{"@id":"https:\/\/www.codemotion.com\/magazine\/#\/schema\/logo\/image\/"},"sameAs":["https:\/\/www.facebook.com\/Codemotion.Italy\/","https:\/\/x.com\/CodemotionIT"]},{"@type":"Person","@id":"https:\/\/www.codemotion.com\/magazine\/#\/schema\/person\/8649554e10cf6f48891694be1891475b","name":"Antonio Musarra","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.codemotion.com\/magazine\/#\/schema\/person\/image\/","url":"https:\/\/secure.gravatar.com\/avatar\/68ceae8da379c8b4cdbe4d25ad5d94f7678e91e07cee64593261baec2ec44a12?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/68ceae8da379c8b4cdbe4d25ad5d94f7678e91e07cee64593261baec2ec44a12?s=96&d=mm&r=g","caption":"Antonio Musarra"},"description":"Ho iniziato il mio viaggio nel mondo dell'informatica da un Olivetti M24 dotato di un processore Intel 8086 acquistato da mio padre esclusivamente per il suo lavoro. Non ho mai posseduto console di nessun genere (Commodore, Amiga, etc\u2026) e inizialmente quell'enorme scatola mi terrorizzava, terrore durato poco; giorno dopo giorno prendevo rapidamente il controllo fino a quando\u2026. Ho sempre creduto che la condivisione della conoscenza sia un ottimo mezzo per la crescita personale; mi piace condividere le mie competenze attraverso articoli tecnici, progetti open source e pubblicazioni su piattaforme come il mio blog personale https:\/\/www.dontesta.it.","sameAs":["https:\/\/www.dontesta.it"],"url":"https:\/\/www.codemotion.com\/magazine\/author\/amusarra\/"}]}},"featured_image_src":"https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2025\/05\/DALL\u00b7E-2025-05-26-11.47.27-A-horizontal-image-of-a-programmer-working-at-their-desk.-The-scene-is-set-in-a-modern-office-with-large-windows-showing-a-cityscape-outside-during-th-600x400.webp","featured_image_src_square":"https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2025\/05\/DALL\u00b7E-2025-05-26-11.47.27-A-horizontal-image-of-a-programmer-working-at-their-desk.-The-scene-is-set-in-a-modern-office-with-large-windows-showing-a-cityscape-outside-during-th-600x600.webp","author_info":{"display_name":"Antonio Musarra","author_link":"https:\/\/www.codemotion.com\/magazine\/author\/amusarra\/"},"uagb_featured_image_src":{"full":["https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2025\/05\/DALL\u00b7E-2025-05-26-11.47.27-A-horizontal-image-of-a-programmer-working-at-their-desk.-The-scene-is-set-in-a-modern-office-with-large-windows-showing-a-cityscape-outside-during-th.webp",1792,1024,false],"thumbnail":["https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2025\/05\/DALL\u00b7E-2025-05-26-11.47.27-A-horizontal-image-of-a-programmer-working-at-their-desk.-The-scene-is-set-in-a-modern-office-with-large-windows-showing-a-cityscape-outside-during-th-150x150.webp",150,150,true],"medium":["https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2025\/05\/DALL\u00b7E-2025-05-26-11.47.27-A-horizontal-image-of-a-programmer-working-at-their-desk.-The-scene-is-set-in-a-modern-office-with-large-windows-showing-a-cityscape-outside-during-th-300x171.webp",300,171,true],"medium_large":["https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2025\/05\/DALL\u00b7E-2025-05-26-11.47.27-A-horizontal-image-of-a-programmer-working-at-their-desk.-The-scene-is-set-in-a-modern-office-with-large-windows-showing-a-cityscape-outside-during-th-768x439.webp",768,439,true],"large":["https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2025\/05\/DALL\u00b7E-2025-05-26-11.47.27-A-horizontal-image-of-a-programmer-working-at-their-desk.-The-scene-is-set-in-a-modern-office-with-large-windows-showing-a-cityscape-outside-during-th-1024x585.webp",1024,585,true],"1536x1536":["https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2025\/05\/DALL\u00b7E-2025-05-26-11.47.27-A-horizontal-image-of-a-programmer-working-at-their-desk.-The-scene-is-set-in-a-modern-office-with-large-windows-showing-a-cityscape-outside-during-th-1536x878.webp",1536,878,true],"2048x2048":["https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2025\/05\/DALL\u00b7E-2025-05-26-11.47.27-A-horizontal-image-of-a-programmer-working-at-their-desk.-The-scene-is-set-in-a-modern-office-with-large-windows-showing-a-cityscape-outside-during-th.webp",1792,1024,false],"small-home-featured":["https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2025\/05\/DALL\u00b7E-2025-05-26-11.47.27-A-horizontal-image-of-a-programmer-working-at-their-desk.-The-scene-is-set-in-a-modern-office-with-large-windows-showing-a-cityscape-outside-during-th-100x100.webp",100,100,true],"sidebar-featured":["https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2025\/05\/DALL\u00b7E-2025-05-26-11.47.27-A-horizontal-image-of-a-programmer-working-at-their-desk.-The-scene-is-set-in-a-modern-office-with-large-windows-showing-a-cityscape-outside-during-th-180x128.webp",180,128,true],"genesis-singular-images":["https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2025\/05\/DALL\u00b7E-2025-05-26-11.47.27-A-horizontal-image-of-a-programmer-working-at-their-desk.-The-scene-is-set-in-a-modern-office-with-large-windows-showing-a-cityscape-outside-during-th-896x504.webp",896,504,true],"archive-featured":["https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2025\/05\/DALL\u00b7E-2025-05-26-11.47.27-A-horizontal-image-of-a-programmer-working-at-their-desk.-The-scene-is-set-in-a-modern-office-with-large-windows-showing-a-cityscape-outside-during-th-400x225.webp",400,225,true],"gb-block-post-grid-landscape":["https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2025\/05\/DALL\u00b7E-2025-05-26-11.47.27-A-horizontal-image-of-a-programmer-working-at-their-desk.-The-scene-is-set-in-a-modern-office-with-large-windows-showing-a-cityscape-outside-during-th-600x400.webp",600,400,true],"gb-block-post-grid-square":["https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2025\/05\/DALL\u00b7E-2025-05-26-11.47.27-A-horizontal-image-of-a-programmer-working-at-their-desk.-The-scene-is-set-in-a-modern-office-with-large-windows-showing-a-cityscape-outside-during-th-600x600.webp",600,600,true]},"uagb_author_info":{"display_name":"Antonio Musarra","author_link":"https:\/\/www.codemotion.com\/magazine\/author\/amusarra\/"},"uagb_comment_info":0,"uagb_excerpt":"Nell&#8217;era digitale, la gestione sicura e affidabile dei documenti \u00e8 una sfida cruciale. Assicurare che un documento non sia stato alterato e che le firme apposte siano autentiche e in una sequenza specifica \u00e8 fondamentale per processi legali, finanziari e amministrativi. L&#8217;obiettivo dell&#8217;articolo si propone di illustrare la Signature Chain come soluzione per la sicurezza&#8230;&hellip;","lang":"it","_links":{"self":[{"href":"https:\/\/www.codemotion.com\/magazine\/wp-json\/wp\/v2\/posts\/33089","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.codemotion.com\/magazine\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.codemotion.com\/magazine\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.codemotion.com\/magazine\/wp-json\/wp\/v2\/users\/299"}],"replies":[{"embeddable":true,"href":"https:\/\/www.codemotion.com\/magazine\/wp-json\/wp\/v2\/comments?post=33089"}],"version-history":[{"count":3,"href":"https:\/\/www.codemotion.com\/magazine\/wp-json\/wp\/v2\/posts\/33089\/revisions"}],"predecessor-version":[{"id":33259,"href":"https:\/\/www.codemotion.com\/magazine\/wp-json\/wp\/v2\/posts\/33089\/revisions\/33259"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.codemotion.com\/magazine\/wp-json\/wp\/v2\/media\/33159"}],"wp:attachment":[{"href":"https:\/\/www.codemotion.com\/magazine\/wp-json\/wp\/v2\/media?parent=33089"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.codemotion.com\/magazine\/wp-json\/wp\/v2\/categories?post=33089"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.codemotion.com\/magazine\/wp-json\/wp\/v2\/tags?post=33089"},{"taxonomy":"collections","embeddable":true,"href":"https:\/\/www.codemotion.com\/magazine\/wp-json\/wp\/v2\/collections?post=33089"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}