In base al commento che ho fatto sulla domanda:
un punto importante è stato chiarito da quasi tutti ... La mia reazione iniziale è stata molto simile a @Michael Brooks, fino a quando ho capito, come @stefanw, che il problema qui è rotto , ma questi sono quelli che sono.
Ma poi mi è venuto in mente che potrebbe non essere nemmeno il caso! Il punto mancante qui è il valore non dichiarato delle risorse dell'applicazione. In parole povere, per un sistema di basso valore, un meccanismo di autenticazione completamente sicuro, con tutto il processo coinvolto, sarebbe eccessivo e la scelta di sicurezza sbagliata .
Ovviamente, per una banca, le "migliori pratiche" sono un must e non c'è modo di violare eticamente CWE-257. Ma è facile pensare a sistemi di basso valore in cui non ne vale la pena (ma è ancora necessaria una semplice password).
È importante ricordare che la vera competenza in materia di sicurezza consiste nel trovare opportuni compromessi, NON nel diffondere dogmaticamente le "Best Practices" che chiunque può leggere online.
Come tale, suggerisco un'altra soluzione: a
seconda del valore del sistema e SOLO SE il sistema ha un valore adeguatamente basso senza risorse "costose" (l'identità stessa, inclusa) E ci sono requisiti aziendali validi che rendono il processo corretto impossibile (o sufficientemente difficile / costoso), E il cliente è a conoscenza di tutti gli avvertimenti ...
Quindi potrebbe essere appropriato consentire semplicemente la crittografia reversibile, senza che siano presenti cerchi speciali.
Mi sto fermando poco prima di dire di non disturbare affatto con la crittografia, perché è molto semplice / economico da implementare (anche considerando la gestione di chiavi passabili) e fornisce QUALCHE protezione (oltre al costo di implementazione). Inoltre, vale la pena guardare a come fornire all'utente la password originale, sia via e-mail, visualizzazione sullo schermo, ecc.
Poiché il presupposto qui è che il valore della password rubata (anche in aggregato) è piuttosto basso, nessuno dei queste soluzioni possono essere valide.
Dato che è in corso una vivace discussione, in realtà TANTE discussioni vivaci, nei diversi post e thread di commenti separati, aggiungerò alcuni chiarimenti e risponderò ad alcuni degli ottimi punti che sono stati sollevati altrove qui.
Per iniziare, penso che sia chiaro a tutti qui che consentire il recupero della password originale dell'utente, è una cattiva pratica e generalmente non è una buona idea. Questo non è affatto in discussione ...
Inoltre, sottolineo che in molte, anzi MOLTO, situazioni - è davvero sbagliato, persino disgustoso, cattivo e brutto .
Tuttavia, il nocciolo della questione è attorno al principio , esiste una situazione in cui potrebbe non essere necessario vietarlo e, in tal caso, come farlo nel modo più corretto appropriato alla situazione .
Ora, come hanno menzionato @Thomas, @sfussenegger e pochi altri, l'unico modo corretto per rispondere a questa domanda è fare un'analisi approfondita del rischio di qualsiasi situazione (o ipotetica) data, per capire cosa è in gioco, quanto vale proteggere e quali altre mitigazioni sono in gioco per garantire tale protezione.
No, NON è una parola d'ordine, questo è uno degli strumenti di base e più importanti per un professionista della sicurezza reale. Le migliori pratiche sono buone fino a un certo punto (di solito come linee guida per gli inesperti e gli hack), dopo che ha preso il sopravvento un'analisi ponderata del rischio.
Sai, è divertente - mi sono sempre considerato uno dei fanatici della sicurezza, e in qualche modo sono dalla parte opposta di quei cosiddetti "Esperti di sicurezza" ... Beh, la verità è - perché sono un fanatico, e un vero esperto di sicurezza nella vita reale - Non credo nel gettare dogma "Best Practice" (o CWE) SENZA quell'importantissima analisi del rischio .
"Attenti al fanatico della sicurezza che è rapido ad applicare tutto nella propria cintura degli strumenti senza sapere quale sia il vero problema contro cui stanno difendendo. Più sicurezza non equivale necessariamente a una buona sicurezza."
L'analisi del rischio e i veri fanatici della sicurezza indicherebbero un compromesso più intelligente, basato sul valore / basato sul rischio, basato su rischio, perdita potenziale, possibili minacce, mitigazioni complementari, ecc. Qualsiasi "Esperto della sicurezza" che non può indicare un'analisi del rischio come la base per le loro raccomandazioni o il supporto di compromessi logici, ma preferirebbe invece spargere dogma e CWE senza nemmeno capire come eseguire un'analisi del rischio, non sono altro che Security Hacks e la loro competenza non vale la carta igienica su cui l'hanno stampata.
In effetti, è così che otteniamo il ridicolo che è la sicurezza aeroportuale.
Ma prima di parlare dei compromessi appropriati da effettuare in QUESTA SITUAZIONE, diamo un'occhiata ai rischi apparenti (apparente, perché non abbiamo tutte le informazioni di base su questa situazione, stiamo tutti ipotizzando - poiché la domanda è quale ipotetico potrebbe esserci una situazione ...)
Supponiamo che un sistema a BASSO VALORE, ma non così trivalente da renderlo pubblico - il proprietario del sistema vuole impedire la rappresentazione casuale, ma la sicurezza "alta" non è così semplice come la facilità d'uso. (Sì, è un compromesso legittimo ACCETTARE il rischio che qualsiasi esperto script-kiddie possa hackerare il sito ... Aspetta, APT non è in voga ora ...?)
Ad esempio, supponiamo che sto organizzando un sito semplice per una riunione di famiglia numerosa, consentendo a tutti di fare brainstorming su dove vogliamo andare in campeggio quest'anno. Sono meno preoccupato per un hacker anonimo, o anche per il cugino Fred che spinge in ripetuti suggerimenti per tornare al lago Wantanamanabikiliki, poiché sono zia Erma che non è in grado di accedere quando è necessario. Ora, la zia Erma, essendo un fisico nucleare, non è molto brava a ricordare le password, o persino a usare i computer ... Quindi voglio rimuovere ogni attrito possibile per lei. Ancora una volta, NON sono preoccupato per gli hack, non voglio solo sciocchi errori di accesso errato - voglio sapere chi sta arrivando e cosa vogliono.
Comunque.
Quindi quali sono i nostri principali rischi qui, se crittografiamo simmetricamente le password, invece di utilizzare un hash unidirezionale?
- Impersonare gli utenti? No, ho già accettato quel rischio, non interessante.
- Amministratore malvagio? Beh, forse ... Ma ancora una volta, non mi interessa se qualcuno può impersonare un altro utente, INTERNO o no ... e comunque un amministratore malintenzionato otterrà la tua password, qualunque cosa accada - se il tuo amministratore è andato male, il suo gioco comunque.
- Un altro problema che è stato sollevato è che l'identità è effettivamente condivisa tra diversi sistemi. Ah! Questo è un rischio molto interessante, che richiede uno sguardo più attento.
Vorrei iniziare affermando che non è l' identità reale condivisa, piuttosto la prova o le credenziali di autenticazione. Va bene, poiché una password condivisa mi consentirà di accedere a un altro sistema (ad esempio, il mio conto bancario o Gmail), questa è effettivamente la stessa identità, quindi è solo una semantica ... Tranne che non lo è . L'identità è gestita separatamente da ciascun sistema, in questo scenario (anche se potrebbero esserci sistemi ID di terze parti, come OAuth - ancora, è separato dall'identità in questo sistema - ne parleremo più avanti).
Pertanto, il punto centrale del rischio qui è che l'utente inserirà volentieri la sua (stessa) password in diversi sistemi - e ora io (l'amministratore) o qualsiasi altro hacker del mio sito avremo accesso alle password di zia Erma per il sito missilistico nucleare.
Hmmm.
Ti sembra qualcosa qui?
Dovrebbe.
Cominciamo dal fatto che proteggere il sistema missilistico nucleare non è una mia responsabilità , sto solo costruendo un sito di uscite per la famiglia di frakkin (per la MIA famiglia). Quindi di chi è la responsabilità? Umm ... E il sistema missilistico nucleare? Duh.
In secondo luogo, se volessi rubare la password di qualcuno (qualcuno che è noto per utilizzare ripetutamente la stessa password tra siti sicuri e siti non così sicuri), perché dovrei preoccuparmi di hackerare il tuo sito? O alle prese con la tua crittografia simmetrica? Accidenti, posso semplicemente creare il mio semplice sito Web , fare iscrivere gli utenti per ricevere NOTIZIE MOLTO IMPORTANTI su tutto ciò che vogliono ... Puffo Presto, ho "rubato" le loro password.
Sì, l'educazione degli utenti torna sempre a morderci nella hienie, vero?
E non c'è niente che tu possa fare al riguardo ... Anche se FAREI inserire le loro password sul tuo sito e fare tutto il resto che la TSA può pensare, hai aggiunto protezione alla loro password NON UNO , se vogliono inserire le loro password in modo promiscuo in ogni sito in cui si imbattono. Non preoccuparti ANCHE di provare.
In altre parole , non possiedi le loro password , quindi smetti di provare ad agire come fai tu.
Quindi, miei cari esperti di sicurezza, come una vecchia signora era solita chiedere a Wendy, "Dov'è il rischio?"
Altri pochi punti, in risposta ad alcune questioni sollevate sopra:
- Il CWE non è una legge, un regolamento o uno standard. È una raccolta di debolezze comuni , vale a dire l'inverso delle "Best Practices".
- Il problema dell'identità condivisa è un problema reale, ma frainteso (o travisato) dai negligenti qui. Si tratta di condividere l'identità in sé e per sé (!), NON di decifrare le password su sistemi di basso valore. Se stai condividendo una password tra un sistema di basso valore e un valore elevato, il problema è già lì!
- A proposito, il punto precedente indicherebbe effettivamente CONTRO l' utilizzo di OAuth e simili sia per questi sistemi di basso valore, sia per i sistemi bancari di alto valore.
- So che era solo un esempio, ma (purtroppo) i sistemi dell'FBI non sono davvero i più sicuri in circolazione. Non proprio come i server del tuo gatto, ma non superano alcune delle banche più sicure.
- La conoscenza divisa, o il doppio controllo, delle chiavi di crittografia NON avviene solo nell'esercito, infatti PCI-DSS ora lo richiede praticamente da tutti i commercianti, quindi non è più così lontano (se il valore lo giustifica).
- A tutti coloro che si lamentano del fatto che domande come queste sono ciò che rende la professione degli sviluppatori così brutta: sono le risposte come quelle che rendono la professione della sicurezza ancora peggiore. Ancora una volta, l'analisi del rischio incentrata sul business è ciò che è richiesto, altrimenti ti rendi inutile. Oltre ad avere torto.
- Immagino che questo sia il motivo per cui non è una buona idea assumere semplicemente uno sviluppatore regolare e lasciargli più responsabilità sulla sicurezza, senza formazione per pensare in modo diverso e cercare i giusti compromessi. Senza offesa, per quelli di voi qui, sono tutto per questo - ma è necessario un maggiore addestramento.
Accidenti. Che post lungo ...
Ma per rispondere alla tua domanda originale, @Shane:
- Spiegare al cliente il modo corretto di fare le cose.
- Se insiste ancora, spiegane ancora un po ', insisti, discuti. Fai un capriccio, se necessario.
- Spiegagli il RISCHIO DI AFFARI per lui. I dettagli sono buoni, le cifre sono migliori, una demo live è di solito la migliore.
- SE ANCORA insiste E presenta valide ragioni commerciali - è tempo che tu faccia una chiamata di giudizio:
questo sito è basso o senza valore? È davvero un caso aziendale valido? È abbastanza buono per te? Non ci sono altri rischi che puoi prendere in considerazione e che supererebbero validi motivi commerciali? (E ovviamente, il client NON è un sito dannoso, ma questo è duh).
Se è così, vai avanti. Non vale la pena, l'attrito e l'uso perduto (in questa ipotetica situazione) per mettere in atto il processo necessario. Qualsiasi altra decisione (di nuovo, in questa situazione) è un cattivo compromesso.
Quindi, linea di fondo e una risposta effettiva: crittografala con un semplice algoritmo simmetrico, proteggi la chiave di crittografia con ACL forti e preferibilmente DPAPI o simili, documentala e fai firmare il client (qualcuno abbastanza esperto da prendere quella decisione) esso.