Sto provando a progettare uno schema di sicurezza che prevede un segreto condiviso ma non è una situazione tradizionale per la password dell'account. Il server memorizzerebbe un insieme di "chiavi", ognuna delle quali ha un blob di dati ad essa associato. Per consentire a chiunque di accedere ai dati per una determinata chiave, tutto ciò che devono sapere è il nome in chiaro della chiave. Quindi se Alice crea i dati usando "ananas" come chiave, Bob può chiedere al server i dati per la chiave "ananas" e il server restituirà i dati.
È del tutto intenzionale che Bob possa condividere la parola segreta ad altre persone o che le persone possano indovinare casualmente "ananas" e ottenere accidentalmente i dati. Voglio solo evitare che qualcuno sia in grado di forzare bruscamente un numero molto grande di tasti per parole di dizionario comuni facilmente. Vorrei che nessuno dei dati in chiaro venisse mai inviato al server, in modo che le persone che eseguono il server non possano spiare i dati dell'utente o nemmeno sapere quali siano le chiavi in chiaro. E idealmente se il server fosse compromesso, ci vorrebbe molto tempo per forzare bruscamente ciascuna delle chiavi in chiaro e / o decrittografare i dati corrispondenti.
La mia idea su come questo potrebbe funzionare, è che se Alice vuole creare nuovi dati, il loro cliente prende la chiave "ananas" ed esegue su di esso un algoritmo hash molto lento, creando eventualmente il corrispondente codice hash per l'ananas. Quindi il loro client crittografa il pacchetto dati con "ananas" usando anche una sorta di metodo di crittografia che è difficile da forzare. Alice avrebbe quindi inviato entrambi al server, il che avrebbe verificato che l'hash non esistesse già e quindi memorizzasse la coppia di hash / dati. Più tardi, Bob potrebbe ripetere lo stesso processo di creazione di un codice hash per ananas, quindi chiedere al server i dati per quell'hash e infine decrittografare i dati restituiti usando l'ananas come chiave. Il processo di creazione dell'hash iniziale sarebbe lento, ma sia Alice che Bob potrebbero memorizzarlo localmente nel proprio client in modo da poterlo fare solo una volta per chiave.
C'è un modo migliore per farlo? Ci sono algoritmi di hash lenti che non implicano l'uso di un salt, il che impedirebbe ad Alice e Bob di capire lo stesso codice hash sicuro senza comunicare tra loro? C'è un modo per usare un salt ma usare ancora questo metodo generale dove il server non vede mai alcun testo in chiaro? Ci sono problemi di sicurezza con questo tipo di schema che non sto considerando?