MS Office fájl védelme

Fórumok

Sziasztok !

A problémám a következő: készítenem kell egy Excel fájlt, aminek egy részét meg kell védenem kíváncsi szemek elől - míg a másik része írható / olvasható marad.

Addig jutottam, hogy elrejtem a kérdéses sheeteket, és jelszóval védem a workbookot módosítástól (az egészet nem jelszavazhatom le). Ez nem sok, ugyanis elég elmenteni a fájlt .xlsx / .xlsm formátumban, átnevezni .zip-re, és az OOXML-t akár jegyzettömbben szerkesztve eltávolítható a jelszavas védelem, valamint a rejtett fülek is előhozhatóak. (gyanítom, hogy a jelenlegi .xlsb is kicsomagolható/átszerkeszthető lenne)

A makrókat is szeretném védeni – de emlékeim szerint annak kódját az Open/Libre/*Office szintén megmutatja jelszavas védelemtől függetlenül.

Milyen módon védenétek meg a fájl tartalmát?

Köszönöm előre is !

Hozzászólások

Céges belső hálózaton megy (Sharepoint nincs), és a fájlnak magának elérhetőnek kell lennie. A feladat az, hogy a fájlban elrejtett alapadatokat nagyon nehezen lehessen csak kinyerni (anélkül, hogy a makró lelassulna, úgyhogy az on the fly dekódolás szerintem nem játszik).

int getRandomNumber() { return 4; }  // ← aláírás
//szabályos kockadobással választva. garantáltan véletlenszerű.  xkcd

csinalnek egy olyat amit mindenki olvashat.
Meg egy olyan varziot amit vedeni kell. S azt 256bites AES-sel kodolnam vagy jelszavas rar-ban adnam oda.

Nagyon szépen köszönöm !
Igen, csak Excel - egyelőre az automation add-in lehet befutó a makrókód védelmére (bár így elsőre ránézve nem kevés kódot kell hozzá átírni)

int getRandomNumber() { return 4; }  // ← aláírás
//szabályos kockadobással választva. garantáltan véletlenszerű.  xkcd

kijelölöd a cellákat amiket így vagy úgy védeni akarsz, aztán a cella tulajdonságainál van egy védelem, vagy cellavédelem, v. ilyesmi fül, ott beállítod, hogy milyen védelmet kapjon, és milyet ne, aztán az egész xls-t lejelszavazod és elvileg kész.

de a súgó, és a net is jó tippeled ad a házi megírásához :))

Sajnos nem működőképes.
- Az egész XLS-t nem jelszavazhatom le, mert a jelszó megadása nélkül megnyithatónak kell lennie.
- Ha viszont nincs lejelszavazva az XLS, akkor XLSM/XLSX-ként elmentve megnyitható úgy, mint egy .zip fájl, és a benne lévő .xml fájlokban a jelszavas védelem is kb. úgy fest, hogy isItProtected="true".

A cellavédelem máshoz jó lenne, de az sem működik: a cellákhoz a kijelölésükkör makróval generálódna egy validation rule - amit viszont nem lehet módosítani védett celláknál. A védelem feloldható makróból, viszont az érezhetően megakasztja az Excelt mindig, amikor változik a cellakijelölés.

int getRandomNumber() { return 4; }  // ← aláírás
//szabályos kockadobással választva. garantáltan véletlenszerű.  xkcd

Webes felület, a fájlt nem adod oda a júzernek, csak egy felületen (alkalmazáson) keresztül tudja túrni távolról. Persze ebben az esetben a xls-t is elfelejteném a pélóba, és raknék alá valami rendes adatbázist inkább.

A helyzet az, hogy szerintem sokan másokhoz hasonlóan ti is olyasmire használjátok az Excelt, amire az kurvára nem való (írjunk üzleti alkalmazást Excel makróban).

Nagyon közel jársz az igazsághoz : egy üzleti alkalmazásba lehet Excelből importálni az adatokat, viszont a saját formátuma nagyon felhasználóbarátságtalan - ehhez készül Excelben egy wrapper.

int getRandomNumber() { return 4; }  // ← aláírás
//szabályos kockadobással választva. garantáltan véletlenszerű.  xkcd

A web service nem lehetséges, mert nem kapok hozzá infrastruktúrát (pedig az lenne ideális).
Az önálló alkalmazásnál továbbra is meg kellene védenem valahogy az adatokat, és sajnos eléggé kötődünk az Excelhez : az Excel beépített funkciói nagyon jól leképezik a feladatot, és ezen kívül a teamem a Visual Basicet ismeri. (a csapat lecserélése / átképzése nehézkes : a cseréhez több hónapnyi knowledge transferre van szükség, más nyelv megtanulására meg nincs kapacitás)

int getRandomNumber() { return 4; }  // ← aláírás
//szabályos kockadobással választva. garantáltan véletlenszerű.  xkcd

A web service nem lehetséges, mert nem kapok hozzá infrastruktúrát (pedig az lenne ideális).

Hát, én inkább korrektnek nevezném a megoldást, mert minden más, az nem korrekt.
Nyilván valakinek fáj az, ha az adatok titkosságát nem lehet megőrizni. Na nála kell összeütköztetni az egymásnak ellentmondó elvárásokat (ne legyen szerver, de legyen titkosság). Valamelyikből engednie kell...

Szóval, ha jól értem, van egy alkalmazás, amibe föl lehet tölteni xls/xlsx file-okat. A klienseid összeállítanának egy adathalmazt, amit a te programod/makróid átkonvertálnak olyan formátumúra, amit az alkalmazás megeszik.
Mit akarsz megvédeni?

--
Debian - The "What?!" starts not!
http://nyizsa.blogspot.com

Az alkalmazás arra való, hogy az input alapján riportokat generáljon. A riportokhoz olyan információt is felhasznál, amihez jobb, ha nem fér hozzá mindenki - csak az aggregált kimenethez, amit a kliensemnek is meg kell mutatnom.

Azt szeretném, hogy a kliensem lássa az alkalmazás kimenetét még mielőtt nekem elküldené az inputját . Mindezt úgy, hogy az alapadatokhoz nehezen férjen csak hozzá.

Analóg feladatok:
1. Az alkalmazásom célja az, hogy jelszavakból generáljon hash-t, amihez a salt a jelszótól függ. A feladatom az, hogy a kliensem ki tudja számolni a hash-t 99%-os pontossággal, anélkül, hogy az Excelfájlban elrejtett saltot meg tudná szerezni.
2. Az alkalmazásom egy gép kimeneti teljesítményét jósolja meg a felhasznált alapanyagok mennyisége és minősége alapján. Ezt kell kiszámolnom Excelben, de anélkül, hogy a gép alapadatai (alkatrészek kopottsága, rendelkezésre álló energia, etc.) és a számolás menete egyértelmű lenne.

(sajnos nem érzem úgy, hogy megoszthatnám a konkrét feladatot, de a második analógia viszonylag közel áll ahhoz, amit szeretnék)

int getRandomNumber() { return 4; }  // ← aláírás
//szabályos kockadobással választva. garantáltan véletlenszerű.  xkcd

Akkor valami fekete doboz-félét szeretnél, amibe bemegy valami, meg kijön belőle valami, de azt nem látni, hogy mi van belül?
Erre szerintem is a web service lenne a legalkalmasabb. Gyanús egyébként, hogy a logikának mindenképp nálad kell maradnia.

--
Debian - The "What?!" starts not!
http://nyizsa.blogspot.com

Igen, ettől tartottam. Sajnos meg kell tartanom offline használhatónak, és nehéz eltérni az exceles megoldástól.

Ötletképpen, a jelenlegi üzleti alkalmazásban ezeket atz adatokat egy saját fájlformátumban tárolják, és a forráskód ismerete nélkül kb. lehetetlen visszafejteni. Valami hasonlót szeretnék elérni: 1) védeni az exceles alkalmazáslogikát (legyen valami bináris formátumban, amit be lehet ágyazni a fájlba, és nincsenek online toolok a visszafejtésére), és 2) az alkalmazáslogikából hatékonyan kicsomagolni / lekérdezni az adatokat.

Tudom, hogy amint odaadom a logikát (márpedig valamilyen formában oda kell adnom), az visszafejthető.
Azt szeretném, hogy meg kelljen érte dolgozniuk: célcsoportom nem crackerekből áll, hanem olyan emberekből, akik napi 8-10 órában teljesen másért kapják a fizetésüket. A cég megbízik bennük, és nem exportálható formában rendelkezésükre is állnak a védendő adatok. Úgy szeretném beletenni az információkat és a logikát az Excelbe, hogy nehezen lehessen exportálni. (és sejtem, hogy azért nehéz, mert az Excel nem erre való)

int getRandomNumber() { return 4; }  // ← aláírás
//szabályos kockadobással választva. garantáltan véletlenszerű.  xkcd

Szerintem a makrok vedelme ily modon logikailag nem lehetseges (de lehet, hogy csak nem gondoltam at rendesen).

Ugyanis az a cel, hogy a makrokat ne lehessen kinyerni a file-bol, de az adott program (Excel) anelkul tudja hasznalni, hogy megadna valaki a jelszot - tehat latnia kell "kodolatlanul".

Ez kb. olyan, mint hogy egy pdf-et lehessen megnyitni de ne lehessen nyomtatni - ha valami meg tudja jeleniteni, akkor nyomtatni is fogja tudni (persze az lehet, hogy az adott program, pl. Acroread nem engedi, de az csak egy flag).

/sza2

Teljesen igazad van: a kérdés leginkább az, hogy el lehet-e úgy rajteni az adatokat és obfuszkálni lehet-e annyira a makrót, hogy ne legyen érdemes megpróbálni visszafejteni (és közben ne legyen nagyon lassú sem)

Pl. amire most gondolok: az adatok el vannak rejtve egy beágyazott adatbázisfájlban (ami jelszóval védett, és az Excel külön dll-ek referálása nélkül tudja olvasni). Az adatbázist minden alkalommal megnyitjuk egyszer a háttérben, amikor kinyílik a workbook (utána már gyorsan olvasható). A megnyitáshoz a legtöbb ember által olvashatatlan kódot használunk (bináris, perl regexp, vagy indiaiak által írt VBA)

int getRandomNumber() { return 4; }  // ← aláírás
//szabályos kockadobással választva. garantáltan véletlenszerű.  xkcd

Kerülő megoldásként tedd 3 excel fájlba a dolgokat.
- public.xls a bárki által elérhető, módosítható adatok
- private.xls és makro.xls a más által nem elérhető adatok és a makró(k)
A public.xls-t tedd egy olyan könyvtárba/megosztásra amire akinek kell adsz jogot.
A private.xls és makro.xls kerüljön olyan könyvtárba/megosztásra amire csak olyan felhasználónak adsz jogot aki futtathatja/kezelheti azt.
Így elvileg kell egy felhasználó aki igény szerint futtatja a makrót elérve minden fájlt, egyébként meg mindenki azt éri el amihez joga van.
Hogy ne kelljen a futtatáshoz mindig valakit megkérni, készíts egy excel makró futtatást automatizáló (autoit vagy powershell) scriptet ami egy gépen (vagy terminal server sessionben) futva pl. percenként megnézi a publikus könyvtárat és ha odakerül pl. egy "run.txt" fájl akkor lefuttatja a makro.xls makróit majd törli a run.txt-t.
--
Légy derűs, tégy mindent örömmel!

Egyszerubb es gyorsabb lenne php-ben/barmi mas ganyolos nyelvben ganyolni egy formot neki...