Excel izpostavlja dve stvari, ki se obema reče "geslo", vendar je le ena izmed njiju šifriranje. Geslo za odpiranje zaklene pravo šifro: brez njega datoteke sploh ni mogoče prebrati. Gesla za zaščito delovnega lista in delovnega zvezka ne počnejo nič takšnega. Nastavijo le zastavice, ki jo sodelujoči urejevalnik obljubi upoštevati, delovni zvezek, ki nosi le to zastavico, pa je navadna berljiva datoteka zip s podatki v čistem besedilu. Izberite napačno možnost in poslali boste plačilno listo, ki je v Excelu videti zaklenjena, prebrati pa jo je mogoče v vsakem urejevalniku besedila
Dokaz traja deset sekund. Preimenujte zaščiteno datoteko .xlsx v .zip, jo odprite v katerem koli arhivskem orodju in si oglejte xl/worksheets/sheet1.xml. Če so vrednosti celic tam v čistem UTF-8, datoteka ni šifrirana, ne glede na to, koliko pozivov za geslo Excel prikaže, ko nekdo poskuša urediti celico. Ta vrzel preživi leta znotraj ekip, ki domnevajo, da je zaščita lista enaka zaupnosti, običajno pa pride na dan tisti dan, ko varnostni pregled izvede natanko to preimenovanje
HotXLS je domača knjižnica preglednic za Delphi in C++Builder, ki te dve funkciji drži na nasprotnih straneh te črte. Zaščita delovnega lista in delovnega zvezka sta omejitvi urejanja, podprti z namerno šibko zapuščinsko zgoščeno vrednostjo. Klic SaveAsEncrypted ustvari z AES šifriran paket, ki ga brez gesla ni mogoče odpreti. Spodnja poglavja opisujejo, kaj ta klic zapiše, asimetrijo, okoli katere morate zasnovati svojo kodo (HotXLS piše šifrirane datoteke, ne more pa jih brati nazaj), in kako se razlikuje starejša pot XLS
Zaščita lista ni šifriranje
Metode Protect na listih in ProtectWorkbook na delovnem zvezku shranijo zgoščeno vrednost gesla s 4 osmiškimi znaki. To je zapuščinski algoritem, ki sta ga OOXML in BIFF podedovala iz Excela iz 90. let prejšnjega stoletja, dokumentacija formata pa nikoli ne trdi, da počne kaj več kot preprečuje nenamerna urejanja. Paket ostane navaden berljiv zip: podatki celic, formule in deljeni nizi so vsi v čistem XML besedilu. Privzeta nastavitev stanje le še poslabša. Vsaka celica se začne z Locked=True, zato klic Protect, ne da bi prej odklenili vhodno območje, zamrzne celoten list pred urejanjem, hkrati pa pusti vsako vrednost na očeh vsem
Nič od tega ne pomeni, da je zaščita nekoristna. Usmerjanje uporabnikov v uredljiva območja in stabilizacija postavitve za tiskanje sta pomembni opravili, obravnavani v našem članku o zaščiti delovnih listov in nastavitvi strani. Vendar so to naloge uporabnosti. Takoj ko je zahteva zaupnost, je edini API, ki nanjo odgovori, klic SaveAsEncrypted
Kaj SaveAsEncrypted dejansko zapiše
Implementacija sledi standardu ECMA-376 Standard Encryption, določenemu v [MS-OFFCRYPTO] poglavju 2.3.4. Geslo gre skozi 50.000 iteracij SHA-1, da se izpelje ključ AES-128. Blok preverjanja, šifriran z AES-128 v načinu ECB, omogoča porabniku potrditev gesla pred dešifriranjem česar koli, celoten paket delovnega zvezka pa se nato šifrira z AES-128 v načinu CBC. Tisto, kar pristane na disku, sploh ni zip. Gre za sestavljeno datoteko OLE (OLE compound file), ki drži tokove EncryptionInfo, EncryptedPackage in DataSpaces, brez imenika xl/, ki bi ga arhivsko orodje lahko izpisalo, zato test preimenovanja zdaj ne razkrije ničesar berljivega. Excel 2007 in novejši jo odprejo zgolj z geslom, trenutni LibreOffice pa prav tako bere Standard Encryption
var
Book: TXLSXWorkbook;
Sheet: TXLSXWorksheet;
rc: Integer;
begin
Book := TXLSXWorkbook.Create;
try
Sheet := Book.Sheets.Add('Payroll');
Sheet.Cells[1, 1].Value := 'Employee';
Sheet.Cells[1, 2].Value := 'Net pay';
Sheet.Cells[2, 1].Value := 'A. Garcia';
Sheet.Cells[2, 2].Value := 4815.16;
rc := Book.SaveAsEncrypted('payroll-2026-06.xlsx', PasswordFromVault);
if rc <> 1 then
raise Exception.CreateFmt('Encrypted save failed (rc=%d)', [rc]);
finally
Book.Free;
end;
end;
S spremenljivko gesla ravnajte enako skrbno kot z nizom za povezavo do baze podatkov. Pridobite jo iz trezorja ali storitve za generiranje skrivnosti v zadnjem trenutku, nikoli je ne zapisujte v dnevnik in nikoli je ne vpišite v sam delovni zvezek. Preverjanje povratne kode ni le neobvezen okras. Šifrirano shranjevanje, ki spodleti na pol poti, mora prekiniti dostavo, saj je edina varnostna možnost, ki jo klicna koda lahko ponudi, nešifrirana kopija, ta kopija pa je natanko tisti incident, ki ga ta funkcija želi preprečiti
Obstaja tudi strojno preverljiv sprejemni test, ki ne stane skoraj nič: pokličete CanReadEncrypted na datoteki, ki ste jo pravkar zapisali. Vrne true le takrat, ko je datoteka resnično šifrirni vsebnik, zato uveljavitev te trditve po vsakem šifriranem shranjevanju ujame regresijo, ki je najbolj pomembna — pot koda, ki se je tiho vrnila na navaden SaveAs —, in sicer v trenutku, ko se to zgodi, in ne tedne kasneje v prejeti pošti stranke. Končna beseda med testiranjem izdaje še vedno pripada ročnemu odpiranju v Excelu z dejanskim geslom
Zasnova samo za pisanje: obravnavanje EXlsxEncryptionNotImplemented
Ta asimetrija ima eno jasno arhitekturno branje: šifrirajte na robu dostave, nazadnje. Ohranite čisto besedilni izvirnik (plaintext master) znotraj meje zaupanja — v bazi podatkov, shrambi dokumentov ali mapi z nadzorovanim dostopom —, šifrirano kopijo pa ustvarite kot zadnji korak, preden datoteka zapusti sistem. Cevovod, ki arhivira le šifrirani izhod, se je zaklenil iz lastnih podatkov, saj nobena kasnejša stopnja istega sistema ne more znova odpreti teh datotek. Ko kasnejši proces HotXLS ponovno potrebuje delovni zvezek, mu predajte čisti izvirnik in nikoli artefakta dostave
Standardno šifriranje AES-128 in skladnost z AES-256
Šifriranje pisarniških datotek prihaja v dveh generacijah. Standardno šifriranje (Standard Encryption), ki ga piše HotXLS, uporablja AES-128 z izpeljavo ključa SHA-1. Šifriranje Agile (Agile Encryption) je prispelo kasneje in prehaja na AES-256 s SHA-512 ter drugačen, z XML opisan vsebnik ključev. Obe se pregledno odpreta v Excelu, AES-128 pa je še vedno računsko trden za zaščito datoteke med prenosom do stranke
Razlika preneha biti akademska tisti dan, ko varnostni vprašalnik zahteva "šifriranje datotek v mirovanju z AES-256". Standardno šifriranje ne dosega te zahteve, ne glede na to, kako močno je geslo, in noben parameter metode SaveAsEncrypted ne spremeni algoritma, ki ga oddaja. Zato v svoji varnostni dokumentaciji natančno navedite profil: AES-128, ECMA-376 Standard Encryption, izpeljava ključa SHA-1 s 50.000 iteracijami. Trditev, ki preživi pregled, je vredna več kot optimistična, ki se sesuje med revizijo
Zapuščinska pot XLS: RC4 ven, RC4 in XOR nazaj notri
RC4 je zastarela kriptografija in nikoli ne bi smela ščititi podatkov, ki so pomembni danes; njena edina preostala vrednost je interoperabilnost s sistemi, ki še vedno izmenjujejo datoteke .xls. Bralna stran pa se izkaže za koristno pri migracijah. Zapuščinska datoteka, zaščitena z geslom, se odpre z Open(FileName, Password), premosti v model OOXML in znova zaščiti prek poti AES — enosmerna nadgradnja, ki teče brez Excela kjer koli v verigi. Za šifrirane dostave velikega obsega veljajo opombe o prepustnosti na strani shranjevanja v našem članku o pretočnem zapisovanju za strežniška paketna opravila za fazo gradnje vsebine, ki se zgodi pred šifriranjem
Šifriranje in zaščita nista tekmeca
Vredno je razčistiti še eno točko, saj se pojavi takoj, ko nekdo prebere opozorilo na vrhu te strani kot "zaščita je brez vrednosti". Ni. Šifriranje in zaščita odgovarjata na različna vprašanja in se čisto zlagata. Šifriranje odloča o tem, kdo lahko odpre datoteko; zaščita določa, kaj lahko bralec, ki je že notri, spremeni. Dostava plačilnih list lahko razumno stori oboje: šifrira paket, tako da ga vidi le imetnik gesla, nato pa zaklene celice s formulami, tako da lahko prejemnik filtrira in razvršča, ne more pa potiho prepisati izračunov. Napaka ni v dodajanju zaščite. Napaka je v tem, da njeno prisotnost obravnavate kot šifriranje, ko je zahtevana zaupnost
Stran skrbništva nima varnostne mreže in to je načrtno. Izpeljava ključa s 50.000 iteracijami obstaja zato, da je ugibanje drago, nič znotraj datoteke pa skrivnosti ne deponira. Izgubljeno geslo pomeni izgubljene podatke. Ustvarjajte, dostavljajte in shranjujte ta gesla z enako disciplino, kot jo uporabljate za poverilnice podatkovnih baz, in šifriranje bo opravilo svojo nalogo
Dejansko šifriranje datoteke je v HotXLS en sam klic. Disciplina živi v vsem okoli klica: skrbništvu gesla, meji samo za pisanje, ki preprečuje, da bi HotXLS znova odprl lasten izhod, in trditvi o algoritmu, ki jo lahko zagovarjate v reviziji. Metoda SaveAsEncrypted in zapuščinska krožna pot se prinaša s komponento HotXLS Component, in delujeta izvorno v procesih Delphi in C++Builder brez kakršne koli avtomatizacije Excela v verigi