Účelem tohoto článku je ukázat, jak lze snadno realizovatelným způsobem transparentně podepisovat a ověřovat dokumenty.
Zřejmou výhodou tohoto přístupu je klid při opětovném otevření dokumentů s jistotou, že mezitím nebyly změněny.
To je obzvláště důležité, pokud ukládáte dokumenty 4D Write Pro jako inteligentní šablony obsahující 4D kód jako externí soubory na disku. Před spuštěním tohoto kódu se chcete ujistit, že soubor nebyl externě upraven.
Nebo v případě externích dokumentů mít jistotu, že pocházejí od správného odesílatele a nebyly během své digitální cesty změněny.
Princip, který se chystáme popsat, platí pro dokumenty aplikace 4D Write Pro, ale s několika drobnými úpravami je použitelný pro jakýkoli jiný typ dokumentu.
Vzorová databáze
Šifrování nebo podpis?
Zde se zaměříme na ověření pravosti dokumentu, tj. jak si být jisti, že nebyl změněn mezi okamžikem, kdy byl zaregistrován svým původním vlastníkem (právním/úředním/atd.), a okamžikem, kdy si jej přečte jeho příjemce (nebo si jej přečte znovu jeho vlastník!). Nemluvíme zde o šifrování, i když to lze také provést, ale to je jiné téma! (Pokud se zajímáte o kryptografii, podívejte se na tento BLOG).
Vytvoření podpisu.
Proces vytváření podpisu je poměrně jednoduchý: z původního dokumentu vytvoříme podpis na základě na celého dokumentu (jako BLOB) pomocí „soukromého“ klíče. Tento podpis (a pouze tento podpis) bude uložen v samotném dokumentu, obvykle na jeho konci.
Čtení podpisu
Před otevřením dokumentu se oficiální podpis znovu přečte. Z celého dokumentu se vytvoří nový BLOB (bez koncového klíče, tedy teoreticky totožný s originálem) a ověří se, tentokrát pomocí veřejného klíče, úzce spojeného se soukromým klíčem, který byl použit k vytvoření podpisu. Výsledek tohoto ověření určí, co se bude dít dál!
V této fázi existují tři možnosti…
Předpokládali jsme, že dokument je podepsán, ale nemusí tomu tak být. Pokud dokument neobsahuje podpis, je na místě opatrnost, i když nemusí jít nutně o poškození.
Zda dokument otevřít, či neotevřít, záleží na tvůrci, uživateli, okolnostech, prostředí… Stručně řečeno, musíte se rozhodnout, co udělat!
Druhou možností je, že podpis odpovídá obsahu. Pak je to dobrá zpráva. Máte jistotu, že dokument je ten, který jste vytvořili nebo který vám byl svěřen/zaslán/atd. a především, že nebyl od svého vzniku změněn. To znamená, že jej můžete s naprostým klidem otevřít, samozřejmě za předpokladu, že odesílateli důvěřujete. Poté jej můžete libovolně upravovat, ukládat, znovu podepisovat nebo nepodepisovat v závislosti na jeho budoucím použití. Pokud jej potřebujete upravit a poté odeslat zpět odesílateli, je dobré jej podepsat sám, aby stejnou operaci mohl provést i budoucí příjemce.
A konečně třetí možností je, že dokument mohl být během přenosu pozměněn (nebo dokonce poškozen). Sebemenší přidaná nebo odstraněná čárka, sebemenší upravený vzorec atd. bude znamenat, že podpis již nebude odpovídat!
Dozvíte se to okamžitě, abyste mohli přijmout příslušná opatření.
Začněme!
V tomto příkladu budeme podepisovat jeden nebo více existujících souborů již uložených ve formátu 4D Write Pro, tj. s příponou . „4wp“. Protože budeme spravovat soubory, budeme používat třídy 4D.File a 4D.FileHandle. A protože budeme spravovat šifrovací, podpisové a ověřovací klíče, budeme používat také třídu 4D.CryptoKey (pokud tyto třídy ještě neznáte, podívejte se na příslušný BLOG…).
SAFE Vytvoření výchozích klíčů
Nejprve vytvoříme dvojici soukromých/veřejných klíčů a uložíme je jednou provždy jako entitu v databázi (Tato dvojice klíčů bude později použita jako „výchozí“ klíče, jako příklad).
$cryptoKey:=ds.CryptoKey.new()
$keyOptions:={type: "RSA"; size: 2048}
$key:=4D.CryptoKey.new($keyOptions)
$cryptoKey.privateKey:=$key.getPrivateKey()
$cryptoKey.publicKey:=$key.getPublicKey()
$cryptoKey.save()
Dokument SAFE Sign
Dále je třeba přidat podpis na konec souboru (4D.File) pomocí soukromého klíče.
Shrnuto, zde je uvedeno, co je třeba udělat:
// 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)
SAFE Zkontrolovat podpis
Nakonec, PŘED otevřením dokumentu, je třeba zkontrolovat jeho podpis. K tomu slouží následující metoda, které je předán soubor (4D.File) a volitelně veřejný klíč
// 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
To funguje s .4wp, ale co ostatní dokumenty?
Když program 4D Write Pro načítá dokument s příponou .4wp, automaticky rozpozná konec dokumentu, abyste věděli, kde jej ukončit. Podpis přidaný na konec souboru jej nijak nenaruší. Jinými slovy, ať už je dokument podepsaný, nebo ne, ať už je podpis správný, nebo ne, soubor .4wp se bez problémů načte, proto je nutné jeho podpis předem zkontrolovat.
U jiných typů dokumentů je možné (dokonce pravděpodobné), že přidání podpisu na konec naruší načítání, takže může být nutné – samozřejmě po ověření – podpis odstranit.
BEZPEČNÉ zrušení podpisu dokumentu
Z tohoto důvodu byla vytvořena tato další metoda, která provádí opačnou operaci.
Odstraní z dokumentu podpis, aby jej uvedla do původního stavu, a pokud dokument není podepsaný, jednoduše neudělá nic.
$fileHandle:=$file.open("write")
//… calculate signature length then…
$fileHandle.setSize($documentSize-$length)
Závěr
Tento jednoduchý příklad ukazuje, jak podepsat dokument a ověřit podpis před jeho otevřením. Při výměně dokumentů mezi dvěma weby jsou zapotřebí dva páry veřejných/soukromých klíčů, ale princip zůstává stejný. Tvůrce dokumentu se podepíše soukromým klíčem a čtenář jej ověří veřejným klíčem dodaným tvůrcem.
Veřejný a soukromý klíč jsou cenným majetkem, který umožňuje jak podpis, tak ověření, a proto je vhodné je uložit do samotného souboru Data!