2011-10-02 2 views
8

J'utilise le jBCrypt Library pour hacher les mots de passe des utilisateurs lorsqu'ils s'inscrivent en utilisant mon application.L'utilisation de jBCrypt pour assécher les mots de passe dans Android App provoque un blocage prolongé

J'utilise la fonction de hachage de base, avec un sel, comme ceci:

String pass = BCrypt.hashpw(rawPass, BCrypt.gensalt()); 

je remarquai une une à deux minute accrocher lors de l'enregistrement, et vérifié le débogueur, confirmant Bcrypt était responsable.

Le salage du mot de passe prend-il vraiment que beaucoup de puissance de traitement? Si oui, une bonne alternative serait d'envoyer le mot de passe en clair au serveur pour le hacher? Ma pensée originale sur le sujet était de le hacher avant qu'il ne soit envoyé n'importe où. Des idées?

+1

Eh bien, en un sens, bcrypt est conçu pour faire exactement cela. Bien sûr, si cela cause une si longue attente au client, ce n'est pas acceptable. – NullUserException

+0

Vous avez essayé d'exécuter le processus de hachage sur un autre thread en plus de l'interface utilisateur? (ex: android.os.AsyncTask) – Skarllot

Répondre

10

Voici an article qui répertorie les temps pris sur un ordinateur portable Mac avec un processeur Core 2 Duo. Donc, oui, Bcrypt risque d'être très lent sur un appareil mobile.

Un autre problème commun est l'initialisation de SecureRandom qui peut être très lent et peut également se bloquer en raison du manque de données aléatoires. Cela variera entre différentes machines et systèmes d'exploitation. Vous trouverez beaucoup de discussion de cela ailleurs, mais c'est quelque chose que vous voudrez tester soit en l'initialisant vous-même en utilisant new SecureRandom() ou en appelant gensalt séparément pour isoler la génération de données aléatoires, puis juste l'heure de l'appel à hashpw.

Une autre question est pourquoi vous voulez réellement le hacher sur le client? Si vous le stockez sur le client et que vous vous connectez localement, cela peut sembler logique, mais s'il est envoyé à un serveur et qu'un login normal implique l'envoi d'un mot de passe en clair au serveur, vous ne gagnez rien. En outre, une idée fausse commune est que hacher un mot de passe avant de l'envoyer au serveur (en se connectant) offre une certaine protection, alors qu'en fait, cela équivaut à envoyer le mot de passe en clair. Un attaquant n'a obtenu que le hachage pour pouvoir y accéder.

Le hachage de mots de passe est un moyen d'empêcher un attaquant d'accéder (ou au moins de le ralentir) si le mot de passe stocké lui-même est compromis. Par conséquent, si le mot de passe est stocké sur le serveur, il doit être envoyé en clair (sur un canal sécurisé) et le serveur doit décider de la façon dont il est haché.

+4

La différence entre l'envoi d'un hachage d'un mot de passe du client au serveur et l'envoi du mot de passe en clair est que s'il est intercepté, il n'est valide que pour ce domaine. Les compromis entre domaines (par des personnes qui réutilisent le même mot de passe sur plusieurs sites) sont assez courants. –

+2

@StevePomeroy BCrypt utilise un salt aléatoire donc en pratique vous ne pouviez pas vérifier le mot de passe sauf s'il était stocké en clair sur le serveur ou si vous avez envoyé le salt au client avant de calculer le hash. Si vous utilisez un canal sécurisé comme HTTPS (ce que vous devriez toujours faire), vous ne gagnez pas grand-chose en termes de protection contre l'interception en transit. Les compromis de mots de passe partagés sont généralement le résultat du vol de la base de données de mots de passe et du fait qu'ils sont en texte brut ou hachés en utilisant un mauvais choix d'algorithme. –

Questions connexes