Vuoi usare bcrypt per l'archiviazione sul lato server: va bene. Devi ricordare perché lo fai: è perché teme che l'area di memoria del server possa essere saccheggiata in qualche modo, e vuoi un ulteriore livello di protezione. Il punto di bcrypt (o qualsiasi altra simile funzione di hashing della password ) è quello di rendere gli attacchi di dizionario più costosi: c'è un sale (per prevenire attacchi paralleli su molte password hash e precomputazioni), e ci sono molte iterazioni (per rendere ogni ipotesi costosa).
Quindi vuoi massimizzare il numero di iterazioni. Ciò implica che l'hashing deve essere fatto su un computer fast . Uno smartphone con codice Java non è veloce (una versione Android abbastanza recente include una macchina virtuale Java con un compilatore JIT che offrirà una velocità non troppo patetica, ma il risultato sarà comunque non competitivo con le capacità del server). Pertanto, si desidera veramente che il bcrypt si verifichi sul lato server. Anche se ottenere il sale dal server era accettabile (dal punto di vista della latenza della rete), la mancanza di prestazioni della CPU sul lato client sarebbe debilitante.
Pertanto, il tuo problema riguarda davvero come trasferire informazioni molto sensibili (la password) dallo smartphone al server, assicurandoti che non venga intercettato durante il transito. Dal momento che un'app non può contenere segreti (perché il reverse engineering funziona, e non è esclusivo di Java), dovrai usare crittografia asimmetrica , con una coppia di chiavi pubblica / privata, in modo tale che il server possieda la chiave privata e il client possa assicurarsi che utilizzi la chiave pubblica destra (e non una falsa chiave controllata da attaccante ). A quel punto, sei molto vicino a SSL.
Utilizzare HTTPS sarebbe il metodo più semplice per ottenere ciò che cerchi; in particolare perché il telefono include già tutto il codice necessario.
Si potrebbe sostenere che HTTPS implichi troppi round-trip di rete. È concettualmente possibile fare di meglio quando ciò che si desidera è una trasmissione a senso unico di alcuni dati segreti sul server; in tal caso, puoi imitare il modello di email, che quindi punta a OpenPGP . È possibile crittografare in modo asimmetrico la password da inviare, utilizzando la chiave pubblica PGP del server noto (codificata nell'app, che non è un problema, è una chiave pubblica ) e inviando il risultato come un singolo HTTP richiesta. Ciò minimizza il traffico di rete, pur facendo affidamento su un formato di crittografia che è sopravvissuto a una certa quantità di revisione esterna. Una ricerca su Google su "libreria android openpgp" fornisce alcuni utili suggerimenti per l'implementazione effettiva.