2010-10-14 15 views
7

Ho bisogno di "proteggere con password" la mia applicazione ma ho bisogno di consigli su dove conservare la password in modo sicuro.Memorizza una password in modo sicuro

Come ho intenzione di fare questo:

La prima volta che il programma viene eseguito, mi chiederà all'utente di creare una password. La password verrà salata e sottoposta a hash in SHA-256, quindi memorizzata nel Registro di sistema o in un file.

Il problema:

Se devo conservare l'hash della password nel Registro di sistema o di un file (o entrambi) allora sarebbe troppo facile per qualcuno solo eliminare la chiave del Registro di sistema o del file e viene richiesto di crea una nuova password ...

Come posso archiviare in modo sicuro la password con hash in modo da rendere più difficile l'eliminazione?

Ho pensato di archiviarlo nel Registro di sistema e anche di creare un file con gli attributi nascosti e di sistema da cui leggere nel caso in cui il file di registro venga cancellato, ma questo sembra sciocco in quanto potrebbe anche essere eliminato abbastanza facilmente.

// Spero di aver postato correttamente questa domanda con i tag corretti - Sono nuovo qui quindi per favore andate piano! ;)

Tutto il meglio

Chris (Shamballa)

+0

Chi/cosa stai difendendo contro? – SLaks

+0

Perché il tuo utente dovrebbe essere in grado di fornire una password in primo luogo e poi mai più? – codymanix

+0

SLaks ... Devo assicurarmi che nessuno possa accedere al programma tranne la persona che ha creato la password. – Shambhala

risposta

15

Questo è fondamentalmente un Programmazione Etica 101 problema. Se stai memorizzando informazioni sul computer di qualcun altro, ricorda che il computer è di loro proprietà e hanno il diritto di cancellare o modificare qualsiasi file o chiave di registro. Cercare di farlo in modo che non possano è una pessima idea.

C'è una buona ragione per cui non puoi farlo. Cosa accadrebbe se qualcuno avesse iniziato a inserire file che non puoi eliminare o modificare sul tuo computer? Estrapolare alla conclusione logica: cosa accadrebbe se un virus iniziasse a inserire file che non è possibile eliminare o modificare sul computer, e lo ha fatto in un ciclo infinito finché il disco rigido non è pieno? Tu conosci se fosse possibile, qualcuno lo proverebbe.

Se si desidera un programma che memorizzi una password in un punto in cui l'utente non può modificarlo, inseriscilo sul server e chiedi al programma di contattarlo tramite una connessione Internet. (Che è una lattina completamente diversa di worm, ma almeno non stai cercando di fare cose impossibili o violare più i diritti di proprietà dei tuoi utenti.)

+2

Internet è un modo molto sicuro, ma poi hai il problema di assicurarti che il tuo servizio sia sempre in grado di consentire l'accesso, come alcuni dei servizi di gioco disponibili. Ciò consentirebbe anche di gestire la struttura della tua licenza (se ne hai una) sul tuo server, se il programma funziona solo quando può connettersi al tuo servizio. Questo ha i suoi svantaggi per non farlo. – jimplode

+0

Sì. Come ho detto, questo porta la sua lattina di vermi. Ma almeno è teoricamente possibile. Ciò che l'OP vuole semplicemente non lo è. –

+0

Penso che il problema etico tagli in entrambi i modi. Finché l'utente può modificare o rimuovere la password _ prima fornendo la password esistente_ Non penso che tu stia prendendo alcun diritto da loro. Il problema è per l'utente che _ desidera specificamente_ bloccare la sua applicazione una volta che è stata creata una password - come può essere realizzato? –

3

La soluzione migliore sarebbe affidarsi a una fonte esterna che il l'utente NON può controllare per memorizzare una parte della password. Altrimenti, non importa dove lo nascondi, può essere facilmente scoperto da qualcuno con pochi strumenti gratuiti e un po 'di tempo.

Personalmente, ho trovato il posto migliore per memorizzare tali dati sia all'aperto, insieme ad altri dati a cui l'applicazione accede frequentemente. Tieni presente che se l'utente ha accesso a modificare i dati, è a rischio.

Se si desidera bloccare il programma, è necessario che la chiave sia già presente prima dell'esecuzione del programma. In questo modo devi solo preoccuparti di come ottieni la chiave, e dal momento che è crittografata, sarebbe più difficile per loro crearne una che funzioni per il tuo sistema.

Per il processo di autenticazione iniziale, è possibile inserire una parte della chiave sul server Web, fornire all'utente una passkey richiesta per creare il file crittografato.L'utilizzo della chiave di accesso li condurrebbe alla chiave sul server e, se è valida, consentirà loro di salvare il file crittografato. Se sei preoccupato per la riattivazione, una volta attivato, puoi eliminare il file sul tuo server web.

Un'altra opzione potrebbe essere quella di utilizzare qualcosa come OnGuard (latest versions) per codificare una chiave a tempo limitato che si fornisce all'utente. Quindi, quando viene eseguita l'attivazione, verificare che la chiave fornita sia scaduta o meno e, in tal caso, non consentire l'attivazione. In questo modo la chiave di attivazione è a rischio solo per un periodo di tempo limitato.

Non passare troppo tempo su questo. Anche il miglior algoritmo può essere rattoppato con alcune istruzioni NOP dopo che l'app è stata distribuita.

+1

Questa è una bella opzione, rilascia il programma con un qualche tipo di blocco tasti. quindi una chiave seriale generata sbloccherà il programma e ne consentirà l'utilizzo e l'esecuzione, quindi consentirà agli utenti di fornire la propria password. Questo è un modello molto più ordinato rispetto al tentativo di insistere per utilizzare la connessione internet per verificare le licenze. Ecco un link a uno starter kit shareware, potrebbe darti qualche idea. http://blogs.msdn.com/b/danielfe/archive/2005/07/10/437293.aspx – jimplode

+0

@jimplode - sì, funziona anche, ma non limita l'uso della chiave a meno che non ci sia qualcosa di esterno da funzionare contro di esso. – skamradt

+0

sì ... licenze e protezione seriale è un affare così difficile !! Se fossi in me non mi preoccuperei di puntare sul mercato professionale che pagherebbe per usarlo e non abusarne. Soprattutto perché sono tutti soggetti ad audit, non possono davvero imbrogliare. Il settore privato .... beh buona fortuna, se è nelle mani del pubblico in generale, sarà rotto, non importa quello che fai. – jimplode

4

È possibile memorizzare in modo sicuro una password per un'applicazione utilizzando Windows crypto API. C'è un esempio del suo utilizzo in CodeGuru, ma è scritto in C++, non in Delphi. Il codice non è troppo impegnativo, quindi dovrebbe essere convertito relativamente facilmente in Delphi.

Una soluzione più avanzata sarebbe chiedere all'utente la password prima di scaricare l'applicazione e incorporare la parte con password hash del file binario - ovviamente se si ottengono più copie dell'applicazione si può facilmente determinare la posizione del valore crittografato e il codice che lo controlla per rimuoverlo.

Il problema è che non hai creato alcun valore dall'uso della password, cioè sembra essere solo una password a parte. È necessario utilizzare la password come seme per crittografare i dati dell'applicazione e legare la password ai dati. Perdi la password e perdi solo i dati.

1

Ci sono almeno 2 modi in cui posso interpretare la tua domanda.

(1) Si desidera memorizzare le password in modo che possano essere utilizzate in un secondo momento per accedere a un database remoto.

This answer su Password encryption in Delphi spiega la parte di crittografia.

In questo modo è possibile memorizzare una password in modo che in un secondo momento possa essere utilizzata per autenticare l'utente quando accede utilizzando l'applicazione su un server di database o qualcosa del genere.

La parte "non cancella" è molto sensibile per gli utenti; Non lo farei.

(2) Si desidera memorizzare una password, in modo che possa essere utilizzata per convalidare un utente per accedere localmente all'applicazione.

Questo è più difficile, in quanto fondamentalmente non è possibile.

Il modo più simile è mantenere in esecuzione un processo in background che mantenga un blocco sul file.
Si comunica con tale processo per sbloccare il file in modo da poter verificare la password.

--jeroen

+0

Mi dispiace - SO scombina la numerazione; Ho digitato 1. e 2. –

+0

... finché l'utente non utilizza Process Manager per rilevare chi è in possesso del blocco, uccide il processo ed elimina il file. ;) –

+1

Ecco perché gli autori di virus e trojan si impegnano così tanto a nascondere le loro cose. E loro non possono. A meno che non installino un kit di root come Sony ha fatto per la protezione dalla copia: http://en.wikipedia.org/wiki/Sony_BMG_CD_copy_protection_scandal –

0

Se avete solo bisogno sola password, cifrare e virare sulla fine del exe. L'ho fatto con successo molte volte.

+0

Se l'utente non è un amministratore o non esegue l'exe elevato, potrebbero non esserci permessi di scrittura. – Remko

+0

Sembra interessante, per memorizzare la password all'interno del programma? Tuttavia, questo non dovrebbe essere contrassegnato dai programmi antivirus? – Shambhala

+0

Oops - Premuto e inviato prima che avessi finito di digitare! Stavo per aggiungere >> Come hai fatto questo? Questo dovrebbe essere aggiunto durante il tempo di esecuzione. – Shambhala

0

Suggerirei di utilizzare le funzioni di autenticazione in Windows, in particolare CredWrite e CredRead.Sarebbe anche possibile utilizzare le finestre di crittografia prevede (CryptProtectData/CryptProtectMemory) e quindi salvare le credenziali

EDIT: Se avete bisogno le intestazioni per Delphi, sono disponibili nel Jedi Windows Api Library.

5

In realtà non si specifica cosa protegge questa password. Immagino che venga usato per proteggere i dati creati dal tuo programma.

Non sono esperto di sicurezza o crittografo ma se i dati sono archiviati localmente la soluzione è semplice. Memorizza sia la password (o più probabilmente un hash della password) che i dati nella stessa posizione (file, DB, ecc.), Crittografati con chiavi separate.

Ciò impedisce l'elusione tramite la cancellazione dei file. Cancellerebbero anche tutti i dati. Ciò ostacolerà tutto tranne l'utente finale più determinato.

+0

Stavo per menzionare anche questo. Utilizzare la password come chiave di crittografia. In questo modo, i loro dati sono davvero protetti e non è necessario cancellare la password. L'unico problema però è che molte persone in realtà non vogliono che i loro dati vengano crittografati. Vogliono essere in grado di recuperare i loro dati nel caso in cui dimenticano la loro password, ma non vogliono che i loro dati siano facilmente accessibili semplicemente aprendo un programma. So che non puoi avere la tua torta e mangiarla, ma è quello che vogliono molti utenti. – Kibbee

+0

La password serve a proteggere l'accesso al programma attuale. vale a dire. essere in grado di accedere effettivamente al programma una volta installato. Il programma che sto sviluppando è un programma di crittografia e-mail. Utilizza AES Rijndael in modalità CBS a 256 bit, quindi questa password viene scelta poco prima del momento della crittografia, ma mai archiviata. Inizializzo la "chiave" che usano con SHA-256 che diventa la chiave effettiva. Non viene mai memorizzato Il problema altrimenti sarebbe chiunque potrebbe decifrare i dati utilizzando un singolo tasto pre-determinato ... – Shambhala

+0

Intendevo la modalità CBC ... – Shambhala

1

A giudicare dalla tua descrizione, non si capisce che, se tutta la sicurezza che hai è

if not SameString(Hash(UserPassword), StoredPassword) then exit; 

Allora avete alcuna sicurezza a tutti, e non è una questione di utente di eliminare il file di password. L'utente può semplicemente aprire il file exe in qualsiasi editor di binario e NOP la parte che fa il controllo:

//if not SameString(Hash(UserPassword), StoredPassword) then exit; 
//Check commented out ---malicious user 

Dovete capire che, anche se si compila la vostra applicazione, contiene ancora tutto il codice sorgente, proprio in assembler. Puoi ancora modificare la fonte, è solo un po 'più difficile perché ora è in una lingua diversa.

Pertanto, se si desidera impedire all'utente di fare qualcosa nella vostra applicazione, ci sono solo due modi:

  1. di protezione dalla scrittura la vostra applicazione ed il suoi file. Oppure memorizzali su un server separato, se non ne hai il controllo. O semplicemente fai di loro un servizio che accetta solo un set fisso di comandi.

  2. Fa in modo che l'app non lo controlli, ma crittografa qualcosa di critico con la password. Certo, l'utente malintenzionato può reimpostare la password o addirittura eliminare completamente la routine di decrittografia, ma dovrà comunque decrittografare i dati.

Ogni altra soluzione può essere aggirata, tutto ciò che differisce è il tempo e le competenze che occorrerà per aggirare. Ad esempio, è possibile crittografare una parte critica del codice dell'applicazione e decrittografarla al volo (fatto una volta). Quindi esegui e cripta nuovamente. Senza la password corretta la tua app non funzionerà mai.

Ma un utente malintenzionato può installare una copia separata dell'app con una password conosciuta, esaminare parti del programma quando vengono decodificate e assemblarle nella sorgente non crittografata. Certo, è un sacco di lavoro. Ma può essere fatto in un tempo finito.

Problemi correlati