2011-10-02 9 views
8

Estoy usando el jBCrypt Library para cortar contraseñas de usuario cuando se registran con mi aplicación.El uso de jBCrypt para eliminar contraseñas en la aplicación de Android provoca una caída prolongada

estoy usando la función básica de hash, con una sal, así:

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

me di cuenta de un una y cincuenta y nueve minutos a colgar al registrarse, y comprobó el depurador, confirmando Bcrypt era responsable.

¿Salar la contraseña realmente toma que mucho poder de procesamiento? En caso afirmativo, ¿sería una buena alternativa enviar la contraseña de texto plano al servidor para que sea hash? Mi pensamiento original sobre el asunto fue hacer hash antes de enviarlo a cualquier parte. ¿Algunas ideas?

+1

Bueno, en cierto modo, bcrypt está diseñado para hacer precisamente eso. Por supuesto, si causa un bloqueo tan prolongado en el cliente, no es aceptable. – NullUserException

+0

¿Ha intentado ejecutar el proceso de hashing en otro hilo además de la IU? (por ejemplo: android.os.AsyncTask) – Skarllot

Respuesta

10

Aquí está an article que enumera los tiempos de una computadora portátil Mac con un procesador Core 2 Duo. Entonces, sí, es probable que Bcrypt sea muy lento en un dispositivo móvil.

Otro problema común es la inicialización de SecureRandom que puede ser muy lenta y también puede bloquearse debido a la falta de suficientes datos aleatorios. Esto variará entre diferentes máquinas y sistemas operativos. Encontrará mucha discusión sobre eso en otro lugar, pero es algo que quizás desee probar, ya sea inicializándolo usted mismo usando new SecureRandom() o llamando al gensalt por separado para aislar la generación de datos aleatorios y luego simplemente sincronizar la llamada al hashpw.

Otra pregunta es ¿por qué realmente quieres hash it en el cliente? Si lo está almacenando en el cliente e iniciando sesión localmente, entonces puede tener algún sentido, pero si se lo envía a un servidor y un inicio de sesión normal implica el envío de una contraseña de texto sin formato al servidor, entonces no está ganando nada. Además, una idea errónea común es que aplicar una contraseña antes de enviarla al servidor (al iniciar sesión) ofrece cierta protección, cuando de hecho es equivalente a enviar la contraseña de texto plano. Un atacante solo tiene que obtener el hash para poder obtener acceso.

Las contraseñas hash son un medio para evitar que un atacante obtenga acceso (o al menos ralentizarlos) si la propia contraseña se almacena.

Por lo tanto, si la contraseña se almacena en el servidor, se debe enviar en texto sin formato (a través de un canal seguro) y el servidor debe tomar la decisión sobre cómo se procesa el hash.

+4

La diferencia entre enviar un hash de una contraseña del cliente al servidor y enviar la contraseña en texto sin formato es que si se intercepta, solo es válida para ese dominio. Los compromisos entre dominios (por personas que reutilizan la misma contraseña en varios sitios) son bastante comunes. –

+2

@StevePomeroy BCrypt usa una sal aleatoria, por lo que en la práctica no se puede verificar la contraseña a menos que se haya almacenado en texto plano en el servidor o se haya enviado la sal al cliente antes de calcular el hash. Si usa un canal seguro como HTTPS (que siempre debería), entonces no gana mucho en términos de protección contra la interceptación en tránsito. Los compromisos de contraseñas compartidas generalmente son el resultado de que la base de datos de contraseñas es robada y está en texto plano o hash usando una mala elección de algoritmo. –

Cuestiones relacionadas