Come salvare efficacemente la password del database all'interno dell'applicazione desktop?

2

Supponiamo di trovarci nel campo delle applicazioni desktop che devono memorizzare i loro dati in un database. Come immagazzino la password per questo database evitando gli errori più ovvi, che sono:

1) hard coding della password del database all'interno del codice (citata come horror di codifica # 21 in "Password hardcoded" all'interno di link )

2) crittografando la password del database e memorizzandola in un file, si dovrebbe spostare il problema su: "dove memorizzo la password che crittografa la password del database?"

3) utilizzando un server di database remoto e un'architettura n-tier in cui il programma non accede direttamente al database ma si autentica con un altro layer che garantisce ogni operazione e la inoltra al livello del database. Tutto viene crittografato tramite ssl e l'autenticazione avviene tramite un certificato digitale (in modo efficace usando la crittografia a chiave pubblica).

Il numero 3 è in realtà una soluzione ma non si applica alle applicazioni desktop che devono funzionare offline!

Qualcuno su un'altra domanda simile ha risposto che "dare agli utenti non fidati un accesso affidabile a un sistema" è irrealizzabile, ecco perché il DRM non ha mai funzionato, tuttavia non ha citato uno studio provato o un teorema provato.

Si noti che lo stesso problema si verifica se si desidera crittografare il database: dove memorizzo la password con cui crittografo un database in un'applicazione desktop?

Qualcuno può fare qualche intuizione? Grazie

NOTA: questo stesso problema è discusso in CWE-259: uso della password hardcoded ma nessuna soluzione definitiva è stata spiegata

    
posta dendini 02.05.2013 - 16:52
fonte

4 risposte

3

Qualsiasi chiave segreta incorporata in un programma può essere ripristinata da una persona che ha pieno accesso a quel programma, il meglio che puoi fare è che richiede molto tempo per farlo.

But let's say you could make the secret totally unrecoverable by analysing the binary.

L'utente può eseguire analisi dinamiche eseguendo il programma mentre monitora la sua memoria e aspetta che la chiave sia costruita.

OK let's say you have managed to use a key without ever building it completely in memory somehow.

La chiave deve ancora essere usata per qualcosa, e l'utente potrebbe esaminare quel meccanismo e usare la chiave anti-forense allo stesso modo.

Let's say the mechanism for constructing and using the key is totally obfuscated beyond recovery.

La chiave deve ancora lasciare il tuo programma per essere utile al di fuori di esso. Potrei semplicemente passare da un database in attesa che la mia chiave segreta venga passata a me, non dovrei assolutamente analizzare il tuo programma. Qualsiasi forma di crittografia che utilizzi dovrebbe essere leggibile dal mio software di database, che sono anche in completo controllo di keypair e simili.

But I have written my own database format which is loaded into the same program as the key which you can't read.

Quindi il tuo programma è completamente bloccato e tutto avviene all'interno. Tranne che no - caricherete librerie dinamiche che potrei modificare modificando così il comportamento del vostro programma.

In definitiva non c'è nulla che funzioni sulla mia macchina su cui non ho il controllo finale. Questo non è qualcosa che puoi evitare.

    
risposta data 02.05.2013 - 20:18
fonte
2

Non puoi. È un problema pollo o uovo .

Chiedi all'utente di inserire la password ogni volta che viene utilizzato il database.

    
risposta data 02.05.2013 - 16:55
fonte
1

Si afferma che quanto segue non si applica perché le applicazioni desktop devono funzionare offline:

Using a remote database server and an n-tier architecture where the program doesn't directly access the database but authenticates with another layer which grants each operation and forwards it to the database layer. Everything is encrypted through SSL and authentication is done via a digital certificate (so effectively using public key cryptography).

Se la tua applicazione ha bisogno di lavorare offline e può funzionare offline, allora uno di questi è vero:

  • Il database è archiviato localmente, nel qual caso una password non è necessaria, in quanto l'utente ha solo accesso ai propri dati. Un esempio potrebbe essere il supporto dell'applicazione con un database SQLite.
  • Il database è archiviato in remoto, ma la possibilità di collegarsi ad esso è facoltativo. In tal caso, è possibile passare all'autenticazione corretta quando l'applicazione non viene più eseguita offline.
risposta data 02.05.2013 - 19:43
fonte
0

Per un'applicazione desktop preferisco l'hashing della password con sale. L'hashing con SHA-256 o SHA-1 plus sale sembra buono. Perché Idealmente una chiave di crittografia per un sistema standalone come spiegato sopra può essere ottenuta con qualche trucco malevolo. l'hashing è una strada a senso unico che garantisce un po 'di forza, quindi non è così male

    
risposta data 05.07.2016 - 19:21
fonte

Leggi altre domande sui tag