hashpw dependency decrypt java security hash char bcrypt

dependency - java bcrypt compare



Usar BCrypt con un char (3)

Hace unas horas, pregunté en Stack Overflow sobre los métodos sobre cómo convertir un char [] en un hash MD5. Se proporcionó una solución, pero se pensó que era insegura, según lo delinearon algunas personas: Generar un hash MD5 con un char []

Neil Smithline me recomendó que haga uso de BCrypt, pero no puedo usar eso con char [] ''s.

La razón por la que estoy usando un char [] para almacenar la contraseña recuperada de un formulario de inicio de sesión es porque .getPassword() solo admite char [].

char[] passwordChars = passwordInputField.getPassword(); String hashed = BCrypt.hashpw(passwordChars, BCrypt.gensalt(12));

Actualmente, estoy tratando de usar el código anterior para generar un hash pero como la variable passwordCars es del tipo a char [], no es compatible con BCrypt.haspw()

Ahora, la única razón por la que no estoy usando un String normal es porque no se borra de la memoria.

Mi pregunta ahora es: ¿es posible de alguna manera usar char [] con BCrypt?

¡Gracias por adelantado!


Las dos impls de Java de bcrypt que encontré toman una cadena como entrada. Como pareces saber, poner la contraseña en una cadena te abre para atacar la memoria.

Puedes usar PBKDF2 así como también bcrypt. Ambos se consideran de primera categoría. Hay ejemplos de código PBKDF2 Java aquí y aquí . Ambos permiten pasar un char[] a las funciones.

Para responder a una pregunta implícita de los comentarios, la razón por la que no usas MD5 o hash es que son demasiado rápidos. Bruto forzando contraseñas con hardware especial se hace posible con ellos. Bcrypt y PBKDF2 están diseñados para ser lentos.

Incluso si va a usar un hash (que recomiendo), debe salarlo. Revertir hashes de contraseña sin sal es trivial (ver esta herramienta ).

La referencia de CrackStation sobre el almacenamiento de contraseñas es una buena referencia general.


La respuesta corta a su pregunta: , es posible usar char[] s con BCrypt en Java.

Los paquetes crypto Bouncy Castle para Java agregaron el algoritmo hash de contraseñas BCrypt (usando el formato String y la codificación Base64 de la implementación de referencia en OpenBSD) en la versión 1.52 (mar 2015), y solo admite contraseñas char[] .

El método relevante para generar una cadena de BCrypt se puede encontrar en org.bouncycastle.crypto.generators. Clase OpenBSDBCrypt y tiene la siguiente firma:

String generate(char[] password, byte[] salt, int cost)

Si desea verificar en el código fuente que el char[] se conserva sin convertirse en String, las clases relevantes son OpenBSDBcrypt , Strings y BCrypt .


Por lo tanto, en función de la implementación presentada en https://github.com/jeremyh/jBCrypt , debe cambiar los métodos hashpw y checkpw para aceptar char[] lugar de String

Probablemente, la parte más difícil es en hashpw ...

try { passwordb = (password + (minor >= ''a'' ? "/000" : "")).getBytes("UTF-8"); } catch (UnsupportedEncodingException uee) { throw new AssertionError("UTF-8 is not supported"); }

La solución más fácil sería volver a poner el char[] en una String , pero estamos tratando de evitarlo. En cambio, basándonos en la respuesta más alta de Conversión de char [] a byte [] , podemos hacer algo más como ...

char[] expanded = password; if (minor >= ''a'') { expanded = Arrays.copyOf(expanded, expanded.length + 1); expanded[expanded.length - 1] = ''/000''; } CharBuffer charBuffer = CharBuffer.wrap(expanded); ByteBuffer byteBuffer = Charset.forName("UTF-8").encode(charBuffer); passwordb = Arrays.copyOfRange(byteBuffer.array(), byteBuffer.position(), byteBuffer.limit());

El método checkpw realidad no necesita ninguna modificación (aparte de los parámetros), ya que utiliza el método hashpw para verificar los resultados.

Entonces, probando ...

// We want the same salt for comparison String salt = BCrypt.gensalt(12); String original = BCrypt.hashpw("Testing", salt); System.out.println(original); String hash = BCrypt.hashpw("Testing".toCharArray(), salt); System.out.println(hash); System.out.println(BCrypt.checkpw("Testing", hash)); System.out.println(BCrypt.checkpw("Testing".toCharArray(), hash));

Salidas ...

$2a$12$KclXlnca78yhcrg1/mNrRepLYqeJE//SRhrh1X3UM7YUQMjY4x8gy $2a$12$KclXlnca78yhcrg1/mNrRepLYqeJE//SRhrh1X3UM7YUQMjY4x8gy true true

Ahora, si tiene una cuenta de GitHub, podría clonar el repositorio original, realizar los cambios sugeridos y generar solicitudes de extracción. Personalmente, tendré la tentación de deshacerme de los métodos checkpw y hashpw que requieren String

También encontré esta implementación del PDKDF2, que usa String , pero luego lo convertí rápidamente en un char[] ... así que, eso fue MUY simplemente para cambiar ...