Come avrete notato qualche tempo fa, 4D offre un modo semplice per criptare i vostri dati. Ora, 4D consente anche di utilizzare lo stesso algoritmo usato per la crittografia dei dati, ma questa volta per le proprie esigenze. Ora è quindi possibile crittografare e decrittografare qualsiasi informazione, sia essa un singolo campo di una tabella o file esterni.
Nota: per illustrare i nuovi comandi presentati in questo post, ecco un HDI contenente finte analisi mediche e i relativi report PDF esterni. In questo HDI, i referti sono criptati e vengono decriptati per ottenere documenti leggibili.
Diventare più forti
Al giorno d’oggi, sempre più dati critici devono essere crittografati per evitare hacking o fughe di dati. Consentendo di criptare facilmente le tabelle, 4D ha già risposto a questa esigenza principale. A volte, però, è necessario crittografare solo un campo di una tabella o file esterni collegati a record come rapporti, fatture o analisi mediche. È già possibile farlo utilizzando la classe 4D.CryptoKey, ma gli algoritmi asimmetrici sono più adatti per la firma delle informazioni. Ora vi offriamo la possibilità di crittografare i vostri dati o file con un forte algoritmo simmetrico AES-256, lo stesso che 4D utilizza per la crittografia di dati e diari.
Dietro le tende
Il nuovo Encrypt data BLOB ottiene un blob e calcola un blob crittografato usando parametri come un oggetto chiave e un sale.
Un oggetto key pass è un oggetto risultante da una chiamata di comando. New data key chiamata di comando. È anche possibile utilizzare direttamente una passphrase invece di un oggetto chiave. Poiché 4D utilizza un algoritmo di tipo AES per la crittografia, il blob risultante ha una dimensione multipla di 16 byte. Pertanto, se la dimensione del blob originale non è un multiplo di 16, il comando aggiungerà byte nulli terminali per completarlo.
Per l’operazione inversa, il nuovo comando Decrypt data BLOB ottiene un blob crittografato e calcola un blob decrittografato usando gli stessi parametri. Attenzione però, se i parametri non hanno gli stessi valori esatti di quelli usati durante la crittografia, il blob decrittografato non sarà uguale a quello originale. In effetti, è il comportamento previsto dalla crittografia!
Il sale non è poi così male
L’uso del sale è un modo per assicurarsi che i dati originali non possano essere recuperati dai dati crittografati. Un modo per violare i dati è l’analisi della frequenza, cioè il confronto delle informazioni crittografate con informazioni originali molto simili. Se si crittografano le stesse informazioni con la stessa passphrase ma con sali diversi, l’impronta digitale (informazioni crittografate) sarà completamente diversa.
Il sale è più importante perché i suoi valori sono multipli. Ad esempio, quando si cripta un campo o un file collegato a un record, si può facilmente usare la chiave primaria come sale. In questo modo, anche se il contenuto del campo o del file originale è lo stesso per diversi record, il contenuto crittografato sarà completamente diverso.
ESEMPIO DI CRITTOGRAFIA DEI FILE
Per gestire facilmente la crittografia e la decrittografia dei file con il recupero delle dimensioni originali, è possibile utilizzare i seguenti metodi.
Questi metodi gestiscono il complemento a 16 byte memorizzando la dimensione originale del file nel file crittografato stesso, in modo da poterla recuperare facilmente durante la decrittografia.
//encryptFile
#DECLARE($originalFile : 4D .File; $passPhrase : Text ; $salt : Integer ; $encryptedFile : 4D .File)->$result : Boolean
// AES-type encryption : as resulting blob size is a multiple of 16 bytes, some final null bytes may be added.
var $fileContent ; $blobToEncrypt; $blobEncrypted : Blob
var $contentLength ; $offset : Integer
$fileContent:=$originalFile.getContent()
// Store original file length at the beginning of the blob to encrypt
$contentLength :=BLOB size($fileContent)
VARIABLE TO BLOB ($contentLength; $blobToEncrypt; $offset)
COPY BLOB ($fileContent; $blobToEncrypt; 0; $offset; $contentLength)
$result :=Encrypt data BLOB($blobToEncrypt; $passPhrase; $salt; $blobEncrypted)
If ($result)
$encryptedFile .setContent($blobEncrypted)
End if
//decryptFile
#DECLARE($encryptedFile : 4D .File; $passPhrase : Text ; $salt : Integer ; $decryptedFile : 4D .File)->$result: Boolean
// AES-type decryption : as encrypted blob size is a multiple of 16 bytes, some final null bytes may have been added.
var $fileContent ; $blobToDecrypt; $blobDecrypted : Blob
var $contentLength ; $offset : Integer
$blobToDecrypt:=$encryptedFile.getContent COPY BLOB()
$result :=Decrypt data BLOB($blobToDecrypt; $passPhrase; $salt; $blobDecrypted)
If ($result)
// Retrieve original file length at the beginning of the decrypted blob
BLOB TO VARIABLE ($blobDecrypted; $contentLength; $offset)
($blobDecrypted; $fileContent; $offset; 0; $contentLength)
$decryptedFile .
setContent($fileContent)
End if
CASO D’USO
Per illustrare l’uso di questi nuovi comandi, ecco un HDI contenente alcune finte analisi mediche e i relativi report PDF esterni. In questo HDI, i referti sono criptati e vengono decriptati per ottenere documenti leggibili.
Ora sta a voi criptare e decriptare i dati come fa 4D!