Abbiamo un'applicazione web basata su Java che viene eseguita localmente sui computer client, come se fosse un'applicazione desktop. Dopo aver autenticato l'utente, crittografiamo e memorizziamo le loro credenziali nella sessione primaverile perché abbiamo una funzionalità che consente all'utente di aprire un'applicazione esterna (anch'essa sviluppata da noi) e ci si aspetta che vengano autenticate automaticamente.
Il nostro problema è sorto perché abbiamo disaccordi sul modo più sicuro per gestire questo processo di trasferimento.
Ecco un riepilogo del processo, che purtroppo è stato deciso senza il nostro contributo. Alla fine ho davvero intenzione di chiedere suggerimenti per un processo migliore, ma ti sto anche cercando di distruggerlo se merita. Per ora rimuoverò i nostri pensieri.
Lato client
- Quando un utente fa clic (un collegamento nella nostra app Web) per avviare un'app esterna, generiamo un valore salt da una data
yyyMMddmm
e lo passiamo al server.
Lato server (Java)
- L'hash java sha-1 ha una chiave segreta aes.
- Il java sha-1 esegue il hash del risultato del passaggio 2, con il sale basato sulla data.
- Utilizziamo i primi 128 bit come chiave di crittografia AES. Noi crittografiamo (e codifica esadecimale) il nome utente, la password e il sale.
- Il risultato viene quindi passato all'app esterna.
Lato applicazione (C)
- Eseguiamo un ciclo per "indovinare" cosa fosse il sale (attraverso un intervallo di minuti prima di "ora").
- Un sale viene generato nel formato
yyyyMMddmm
. - Il C sha-1 ha l'hash della chiave segreta.
- Il sha sha di C-1 è il risultato del passaggio 8, con il sale basato sulla data.
- Utilizziamo i primi 128 bit come chiave di crittografia AES. Noi crittografiamo (e esadecimale) il sale.
- Se il sale non corrisponde al sale crittografato fornito da java, il ciclo continua.
- Se il sale corrisponde, proviamo a decifrare le credenziali dell'utente.
Al di fuori del fatto che tutto ciò avviene su un singolo sistema e se un utente ha accesso non autorizzato, avrà accesso a tutto il necessario per acquisire e decifrare le credenziali - riteniamo che ci sia molto che possa essere fatto per migliorare questo processo. "Indovinare" un sale sembra una scelta terribile e tutto ciò è troppo complesso e sembra molto più "sicuro" di quanto non sia in realtà.
Alcune domande specifiche:
- C'è un modo migliore per crittografare e consegnare i dati quando succede tutto su un singolo sistema?
- Usare un sale che è semplicemente la data è una pratica scadente, che cosa è una pratica migliore?
- Ci sono problemi con la codifica di tutto con hex contro base64, specialmente quando si utilizzano URL di protocollo esterni?
- È corrucciato per "salare un sale con se stesso"?