2009-03-05 18 views
8

Quindi ho un'applicazione web che si integra con molte altre API e servizi che richiedono l'autenticazione. La mia domanda è, è sicuro memorizzare le credenziali di autenticazione in testo normale nel mio codice sorgente? Cosa posso fare per memorizzare queste credenziali in modo sicuro?È sicuro archiviare le password nel codice sorgente dell'applicazione Web?

Penso che questo sia un problema comune, quindi mi piacerebbe vedere una soluzione che protegga le credenziali nelle risposte.

In risposta a commentare: Mi capita spesso di uso PHP, Java e RoR

mi piacerebbe vedere alcune più voti per una risposta su questa domanda.

+0

Se hai specificato le tecnologie che stai utilizzando per questa applicazione, possiamo darti avvertenze e consigli più specifici. – overslacked

+0

Uso frequentemente PHP, Java e RoR – Blaine

+0

Molte delle risposte qui sono direttamente contrarie alle migliori pratiche. Considera [security.se] per un pubblico che abbia più familiarità con i problemi in questione. –

risposta

2

Sembra la risposta è la seguente:

  1. Non inserire credenziali in codice sorgente, ma ...
  2. Mettere le credenziali in un file di configurazione di log
  3. Sanitize file
  4. Set corretta autorizzazioni/proprietà su configs

Probabilmente più a seconda della piattaforma ...

3

Non è raccomandato.

Un encrypted web.config sarebbe un luogo più adatto (ma nota non può essere utilizzato con una web farm)

+0

Ma ... per poterlo utilizzare, non è necessario decodificarlo in fase di esecuzione? E se sì, non significa che il metodo di decrittazione è nel tuo codice sorgente? Non capisco come questo sia più sicuro. –

+0

@Andrew conoscere il metodo di decrittografia non ti avvicina di più alla decrittografia. Si tratta di proteggere la chiave (s). Ecco perché i buoni algoritmi di crittografia possono essere di dominio pubblico. –

+0

Ma allora la chiave non deve essere nel codice sorgente per decodificare il file web.config? – OverloadUT

1

No, non lo è.

Inoltre, è possibile cambiare la password un giorno e probabilmente cambiare il codice sorgente potrebbe non essere l'opzione migliore.

1

No. A volte è inevitabile. Un approccio migliore consiste nell'avere un'architettura configurata in cui il servizio si fida implicitamente del codice in esecuzione in base a un altro trust. (Come fidarsi della macchina il codice è in esecuzione, o confidando l'application server che esegue il software)

Se nessuno di questi sono disponibili, sarebbe perfettamente accettabile per scrivere il proprio meccanismo di fiducia, anche se vorrei tenere è completamente separato dal codice dell'applicazione. Inoltre, consiglierei di cercare modi per tenere le password fuori dalla portata dei predatori, anche quando sono archiviate su una macchina locale - ricordando che non è possibile proteggere nulla se qualcuno ha il controllo della macchina fisica su cui si trova.

3

L'unico motivo per NON memorizzare il PW nel codice è semplicemente a causa del problema di configurazione (ad esempio, è necessario modificare la password e non si desidera ricostruire/compilare l'applicazione).

Ma la fonte è un luogo "sicuro" per contenuti "sensibili alla sicurezza" (come password, chiavi, algoritmi). Ovviamente è.

Ovviamente le informazioni sensibili per la sicurezza devono essere adeguatamente protette, ma questa è una verità di base indipendentemente dal file utilizzato. Che si tratti di un file di configurazione, di un'impostazione di registro o di un file .java o .class.

Da un punto di vista dell'architettura, è una cattiva idea per la ragione sopra menzionata, proprio come non dovresti "hardcoded" qualsiasi dipendenza "esterna" nel tuo codice se puoi evitarlo.

Ma i dati sensibili sono dati sensibili. Incorporare un PW in un file di codice sorgente rende quel file più sensibile di altri file di codice sorgente, e se questo è il tuo esercizio, considererei tutto il codice sorgente sensibile come la password.

+0

Sì. Potrebbe anche essere utile ricordare che anche dopo la compilazione, il codice oggetto/eseguibile prodotto è anche sensibile. – thomasrutter

+7

"L'unico motivo per NON memorizzare la PW nel codice è semplicemente a causa del problema di configurazione" - ** NO **. Gli sviluppatori non hanno necessariamente le password di produzione. Questo è un grande motivo per non inserire password nel codice. Non dare per scontato che tutte le organizzazioni funzionino come le tue. –

6

Ecco cosa facciamo con le nostre password.

$db['hostname'] = 'somehost.com' 
$db['port'] = 1234; 

$config = array(); 
include '/etc/webapp/db/config.php'; 

$db['username'] = $config['db']['username']; 
$db['password'] = $config['db']['password']; 

Nessuno ma l'utente ha accesso a server web /etc/webapp/db/config.php, in questo modo si protegge il nome utente e la password da parte degli sviluppatori.

+5

Se si ha accesso al codice sorgente, è sufficiente stampare la password dall'array o inserirla in un file o inviarla tramite e-mail una volta che il codice è stato messo in produzione. – MaxVT

+0

Sì, è vero, puoi anche hackerare gli account degli utenti e rubare i numeri delle carte di credito senza nemmeno conoscere la password db se hai accesso al codice sorgente e nessuno può fermarti se sei abbastanza intelligente. –

+0

Se si dispone del codice sorgente * ma non si ha accesso all'ambiente di produzione *, qualsiasi cosa si eseguirà lascerà tracce. In un'organizzazione ben gestita, uno sviluppatore che acquisisce il codice per la produzione richiede il suo check-in, eventualmente inviando altri a firmare che hanno fatto una revisione del codice prima di unire al master, ecc. –

1

Se si controlla il server Web e lo si mantiene per gli aggiornamenti di sicurezza, quindi nel sorgente (preferibilmente in un modulo di configurazione) o in un file di configurazione che l'origine utilizza è probabilmente il migliore.

Se non si controlla il server Web (ad esempio, si è su un server condiviso o addirittura dedicato fornito da una società di hosting), la crittografia non sarà di grande aiuto; se l'applicazione può decrittografare le credenziali su un determinato host, l'host può essere utilizzato per decrittografare le credenziali senza il tuo intervento (pensa al root o all'amministratore guardando il codice sorgente e adattare la routine di decrittografia in modo che possa essere usata per leggere il configurazione). Questa è ancora più una possibilità se si utilizza codice gestito non offuscato (ad es. JVM o .NET) o un linguaggio di scripting Web che risiede in chiaro sul server (come PHP).

Come di solito, c'è un compromesso tra sicurezza e accessibilità. Penserei a quali minacce stai cercando di evitare e trovare un modo per proteggermi dalle situazioni di cui hai bisogno. Se stai lavorando con dati che devono essere protetti, dovresti probabilmente redigere il database abbastanza regolarmente e spostare i dati offline su un server database protetto e ben protetto non appena diventa obsoleto sul sito. Ciò includerebbe dati come numeri di previdenza sociale, informazioni di fatturazione, ecc., Che possono essere referenziati. Ciò significherebbe anche che preferiresti controllare i server della tua rete che forniscono servizi di fatturazione o archiviazione sicura dei dati.

1

Preferisco tenerli in un file di configurazione separato, che si trova da qualche parte al di fuori della radice del documento del server web.

Sebbene questo non protegga da un utente malintenzionato che sovrascrive il mio codice in modo che possa essere forzato a dirgli la password, ha comunque un vantaggio rispetto al mettere le password direttamente nel codice (o in qualsiasi altro web -accessible file) in quanto elimina la preoccupazione su una errata configurazione del server Web (o bug/exploit) che consente a un utente malintenzionato di scaricare direttamente il file contenente la password.

-4

Nessuno sembra aver ancora menzionato hashing - con un algoritmo hash forte (ad esempio SHA-2 e non MD5), dovrebbe essere molto più sicuro.

+6

Memorizzazione di un hash di credenziali che è necessario fornire a un altro il sistema è completamente inutile. Gli hash non possono essere invertiti per ottenere le credenziali originali e l'API o il database a cui hai bisogno non accetterà solo l'hash (se lo fosse, la memorizzazione dell'hash sarebbe esattamente sicura quanto l'archiviazione della password in chiaro) . – geoffspear

0

Un approccio è quello di crittografare le password prima di mettere la password nel config.web

0

sto scrivendo questo per il servizio di web app che riceve la password, non cliente: se si salva hash passsword nel codice sorgente qualcuno che vede il codice sorgente non sarà in grado di aiutare se stesso con quell'hash. Il programma riceverà una password semplice e lo cancellerà e confronterà entrambi gli hash. Ecco perché salviamo le password con hash nei database, non in testo semplice. Perché non possono essere invertiti se qualcuno, ad esempio, ruba db o lo visualizza per scopi dannosi, non otterrà tutte le password degli utenti, solo gli hash che sono piuttosto inutili per lui.

L'hashing è un processo a 1 via: produce lo stesso valore dalla stessa origine ma non è possibile calcolare il valore sorgente dall'hash.

Memorizzazione sul client: quando l'utente inserisce il pass u salvarlo in db/file in testo in chiaro, forse offuscare un po 'ma non molto da fare per impedire a qualcuno che ottiene una sospensione di quel computer di ottenere quella password.

Problemi correlati