Is my suggested approach cryptographically secure?
In effetti, un utente malintenzionato esaminerà la tua implementazione e sfrutterà il fatto che stai facendo affidamento su un PRF a cui l'utente malintenzionato può accedere. Avresti almeno bisogno di separare il PRF dal resto per essere sicuro. Soprattutto, dal momento che dichiari che avresti inviato un ID utente univoco al PRF durante il tuo "processo di autorizzazione" (chiamiamolo) ". Se supponiamo che la chiave univoca non cambi, stiamo anche spostando verso un problema di riutilizzo della chiave, che apre ulteriori vettori di attacco; soprattutto con la tua implementazione di esempio. Ma non entrerò in troppi dettagli, perché diventerebbe presto troppo ampio. La breve storia è: hai ragione, la tua implementazione descritta non è sicura ...
What other, better or simpler approaches could I take to solving this problem?
Potrebbero essere facilmente trovate soluzioni potenziali in crittografia a chiave pubblica . Oppure, potresti provare a fare affidamento su uno scambio dati autorizzato con un server web utilizzando una connessione HTTPS protetta in modo che il server fornisca la funzionalità PRF, ma questo è meno sicuro e non sono sicuro se soddisfi tutte le tue esigenze crittografiche .
Personalmente, consiglierei di andare per chiave pubblica cripto quando si tratta di un'app di comunicazione come la descrivi nella tua domanda, perché è il solito modo di gestire la situazione / funzionalità che descrivi. Può sembrare un po 'noioso, ma non è necessario reinventare la ruota finché sono disponibili opzioni ben controllate. Soprattutto se la tua conoscenza crittografica non è (almeno) a livello professionale. E anche in questo caso, i professionisti tenderanno a sperimentare cripto-implementazioni invece di provare a creare la loro propria cripto-soluzione. È probabile che tu stia scherzando (come il PRF su cui fai affidamento sarebbe condiviso con gli attaccanti) è troppo grande per ... un difetto minore nella tua crittografia può rapidamente trasformarsi in un'app 100% insicura.
Ora non hai menzionato alcun linguaggio di programmazione, quindi non posso indicarti una direzione specifica, ma le soluzioni a chiave pubblica (librerie ecc.) sono disponibili per quasi tutti i linguaggi di programmazione. Dovrebbe essere facile trovare qualcosa di appropriato per i tuoi scopi. E se qualsiasi domanda relativa alla chiave crittografica pubblica stessa si presenta lungo il percorso, si prega di sentirsi invitati a inviare un'altra domanda qui come Crypto.SE.