Se volessi realizzare qualcosa di abbastanza sicuro io farei una cosa del genere:
- file di Office protetto da password di apertura (l'unica che di fatto cifra completamente il file, risultando quindi più difficilmente aggirabile) estremamente lunga e generata in maniera casuale;
- exe autoestraente che decomprime in una directory temporanea il file in questione e un launcher; provvede quindi ad avviare il launcher;
- il launcher (un programma scritto ad-hoc) verifica la data di sistema (confrontandola con quella "limite" incorporata nelle sue risorse, possibilmente cifrata con crittografia asimmetrica in modo che non si possa modificare senza avere la chiave privata) ed eventualmente la sua stessa integrità; sempre dalle sue risorse viene estratta e decifrata la chiave di apertura del documento di Office (che potrebbe essere cifrata usando, ad esempio, usando la "data di scadenza cifrata", giusto per confondere ulteriormente le acque);
- per prevenire attacchi di tipo "tiro indietro l'orologio" si può anche aggiungere eventualmente un check ad un server NTP (nel caso in cui si richieda che Internet sia sempre disponibile - ma in tal caso si possono usare schemi di protezione più semplici), o anche salvare di volta in volta la data dell'ultimo avvio da qualche parte - se si vede che è stato tirato indietro l'orologio il check fallisce
- se il check passa, il launcher provvede ad avviare il documento di Office, passando direttamente ad Office la password con cui aprirlo; credo si possa fare usando le interfacce COM di Office, ma dovrei verificare (nota che per il fatto che il file è protetto l'utente può anche risalvarlo o copiarlo, ma per riaprirlo dovrebbe comunque avere la password);
- se il check non passa, o semplicemente il file non viene aperto, o addirittura il launcher può provvedere ad eliminare l'exe autoestraente, il file di Office e sé stesso.
Baco clamoroso di tutta questa roba: nulla impedisce all'utente di fare copia-incolla delle parti che gli interessano. Se il documento è un PDF forse è meglio.![]()