4D Write Pro – Firmare e proteggere i documenti

Tradotto automaticamente da Deepl

Lo scopo di questo articolo è mostrare come, in modo semplice, sia possibile firmare e verificare i documenti in modo trasparente.
Il vantaggio evidente di questo approccio è la tranquillità quando i documenti vengono riaperti, sapendo che non sono stati modificati nel frattempo.

Ciò è particolarmente importante se si archiviano i documenti di 4D Write Pro come modelli intelligenti contenenti codice 4D come file esterni su disco. Prima di eseguire il codice, si desidera assicurarsi che il file non sia stato modificato esternamente.

O, nel caso di documenti esterni, essere certi che provengano dal mittente giusto e non siano stati modificati durante il loro percorso digitale.
Il principio che stiamo per descrivere si applica ai documenti di 4D Write Pro, ma vale per qualsiasi altro tipo di documento, con qualche piccola modifica.

Esempio di database

Crittografia o firma?

Qui ci concentreremo sull’autenticazione di un documento, cioè su come essere sicuri che non sia stato modificato tra il momento in cui è stato registrato dal suo proprietario originale (legale/ufficiale/ecc.) e il momento in cui viene letto dal suo destinatario (o riletto dal suo proprietario!). Non stiamo parlando di crittografia, anche se si può fare, ma questo è un altro argomento! (Se siete interessati alla crittografia, consultate questo BLOG).

Creare una firma.

Il processo di creazione di una firma è abbastanza semplice: dal documento originale si crea una firma basata sull’intero documento (come BLOB) utilizzando una chiave “privata”. Questa firma (e solo questa) sarà memorizzata nel documento stesso, di solito alla fine del documento.

Rilettura della firma

Prima di aprire il documento, la firma ufficiale viene riletta. Verrà creato un nuovo BLOB dall’intero documento (senza la chiave finale, quindi teoricamente identico all’originale) e verrà verificato, questa volta utilizzando una chiave pubblica, intimamente legata alla chiave privata che è stata utilizzata per creare la firma. Il risultato di questa verifica determinerà ciò che accadrà in seguito!

A questo punto, ci sono tre possibilità…

Abbiamo dato per scontato che il documento sia firmato, ma non è necessariamente così. Se il documento non contiene una firma, occorre fare attenzione, anche se non è necessariamente corrotto.
Se aprire o meno il documento dipende dallo sviluppatore, dall’utente, dalle circostanze, dall’ambiente… In breve, dovete decidere voi cosa fare!

La seconda possibilità è che la firma corrisponda al contenuto. Allora è una buona notizia. Potete essere sicuri che il documento è quello che avete creato o che vi è stato affidato/inviato/ecc. e soprattutto che non è stato modificato dalla sua creazione. Ciò significa che potete aprirlo in tutta tranquillità, a condizione che vi fidiate del mittente. Sarete poi liberi di modificarla, salvarla, firmarla nuovamente o meno, a seconda del suo utilizzo futuro. Se dovete modificarlo e poi rispedirlo al mittente, è bene che lo firmiate voi stessi, in modo che la stessa operazione possa essere effettuata dal futuro destinatario.

Infine, la terza possibilità è che il documento possa essere stato alterato (o addirittura corrotto) durante il trasferimento. La minima virgola aggiunta o rimossa, la minima formula modificata, ecc.
Lo saprete immediatamente, in modo da poter prendere i provvedimenti del caso.

Iniziamo!

In questo esempio, firmeremo uno o più file esistenti già salvati in formato 4D Write Pro, cioè con estensione . “4wp”. Poiché gestiremo i file, utilizzeremo le classi 4D.File e 4D.FileHandle. E poiché gestiremo chiavi di crittografia, firma e verifica, utilizzeremo anche 4D.CryptoKey (se non conoscete ancora queste classi, consultate il BLOG corrispondente…).

Creare chiavi predefinite SAFE

Prima di tutto, creeremo una coppia di chiavi private/pubbliche e le memorizzeremo una volta per tutte come entità nel database (questa coppia di chiavi sarà utilizzata in seguito come chiavi “predefinite”, a titolo di esempio).

$cryptoKey:=ds.CryptoKey.new()
$keyOptions:={type: "RSA"; size: 2048}
$key:=4D.CryptoKey.new($keyOptions)

$cryptoKey.privateKey:=$key.getPrivateKey()
$cryptoKey.publicKey:=$key.getPublicKey()

$cryptoKey.save()

Firma del documento SAFE

Successivamente, è necessario aggiungere una firma alla fine di un file (4D.File) utilizzando una chiave privata.
In sintesi, ecco cosa occorre fare:

// create a new key based on private key
$keyOptions:={type: "PEM"; pem: $privateKey}
$key:=4D.CryptoKey.new($keyOptions)

//…
// create the signature with the .sign() function
$signOptions:={hash: "SHA512"; encodingEncrypted: "Base64URL"}
$signature:=$key.sign($documentAsBlob; $signOptions)

// append signature (as a BLOB) at the end of the document
TEXT TO BLOB($signature; $blobSignature; UTF8 text without length)
$fileHandle.offset:=$documentSize
$fileHandle.writeBlob($blobSignature)

Controllare la firma SAFE

Infine, PRIMA di aprire il documento, è necessario verificarne la firma. Questo viene fatto con il metodo seguente, al quale viene passato un file (4D.File) e, facoltativamente, una chiave pubblica.

// create a new key based on public key
$signOptions:={hash: "SHA512"; encodingEncrypted: "Base64URL"}
$type:={Type; "PEM"; pem; $publicKey}
$key:=4D.CryptoKey.new($type)

// read the real signature 	
//…
$fileHandle.offset:=$documentSize-$length
$blobSignature:=$fileHandle.readBlob($length)
$textSignature:=BLOB to text($blobSignature; UTF8 text without length)

// check the signature using the .verify() function
$check:=$key.verify($documentAsBlob; $signature; $signOptions)
If ($check.success)
	$result:=1
Else 
	$result:=-1
End if 

Questo metodo funziona con i file .4wp, ma che dire di altri documenti?

Quando 4D Write Pro carica un documento .4wp, la fine del documento viene rilevata automaticamente in modo da sapere dove fermarsi. La firma aggiunta alla fine del file non lo interrompe. In altre parole, che il documento sia firmato o meno, che la firma sia corretta o meno, il file .4wp verrà caricato senza alcun problema.

Per altri tipi di documenti, è possibile (o addirittura probabile) che l’aggiunta di una firma alla fine ne interrompa il caricamento, per cui potrebbe essere necessario – ovviamente dopo averla convalidata – rimuovere la firma.

Documento SAFE Unsign

Per questo motivo, è stato creato quest’altro metodo per eseguire l’operazione opposta.
Rimuove la firma da un documento per riportarlo allo stato originale e, se il documento non è firmato, non fa nulla.

$fileHandle:=$file.open("write")  
//…  calculate signature length then…
$fileHandle.setSize($documentSize-$length)

Conclusione

Questo semplice esempio mostra come firmare un documento e verificare la firma prima di aprirlo. Quando si scambiano documenti tra due siti, sono necessarie due coppie di chiavi pubbliche/private, ma il principio rimane lo stesso. Il creatore del documento firma con una chiave privata e il lettore la verifica con la chiave pubblica fornita dal creatore.
Le chiavi pubbliche e private sono beni preziosi, che consentono sia la firma che l’autenticazione, ed è per questo che è consigliabile salvarle nel file di dati stesso!

Roland Lannuzel
- Product Owner ed esperto di 4D - Dopo aver studiato elettronica, Roland è passato all'IT industriale come sviluppatore e consulente, realizzando soluzioni per i clienti con una varietà di database e tecnologie. Alla fine degli anni '80 si è innamorato di 4D e lo ha utilizzato per scrivere applicazioni aziendali che includono sistemi di contabilità, fatturazione e posta elettronica. Entrato a far parte dell'azienda nel 1997, Roland ha dato il suo prezioso contributo progettando specifiche, strumenti di test e demo, oltre a formare e parlare alla comunità 4D in occasione di numerose conferenze. Continua a plasmare attivamente il futuro di 4D definendo nuove funzionalità e strumenti di sviluppo di database.