Necesito hash contraseñas para el almacenamiento en una base de datos. ¿Cómo puedo hacer esto en Java?
Esperaba tomar la contraseña de texto sin formato, agregar una sal aleatoria, luego almacenar la sal y la contraseña hash en la base de datos.
Luego, cuando un usuario deseaba iniciar sesión, podía tomar su contraseña enviada, agregar la sal aleatoria de la información de su cuenta, hacer un hash y ver si equivale a la contraseña de hash almacenada con la información de su cuenta.
java
passwords
cryptographic-hash-function
Chris Dutrow
fuente
fuente
Respuestas:
En realidad, puede usar una instalación integrada en el tiempo de ejecución de Java para hacer esto. SunJCE en Java 6 es compatible con PBKDF2, que es un buen algoritmo para usar para el hash de contraseñas.
Aquí hay una clase de utilidad que puede usar para la autenticación de contraseña PBKDF2:
fuente
BigInteger
: se eliminan los ceros a la izquierda. Eso está bien para la depuración rápida, pero he visto errores en el código de producción debido a ese efecto.Aquí hay una implementación completa con dos métodos que hacen exactamente lo que quieres:
El punto es que incluso si un atacante obtiene acceso tanto a su base de datos como a su código fuente, las contraseñas siguen siendo seguras.
Estamos almacenando
'salt$iterated_hash(password, salt)'
. La sal son 32 bytes aleatorios y su propósito es que si dos personas diferentes eligen la misma contraseña, las contraseñas almacenadas seguirán siendo diferentes.El
iterated_hash
, que es básicamentehash(hash(hash(... hash(password, salt) ...)))
lo hace muy caro para un atacante potencial que tiene acceso a la base de datos de contraseñas de adivinar, hash de ellos, y buscar los hashes en la base de datos. Debe calcular estoiterated_hash
cada vez que un usuario inicia sesión, pero no le cuesta tanto en comparación con el atacante que gasta casi el 100% de su tiempo calculando hashes.fuente
char[] password
lugar deString password
.BCrypt es una muy buena biblioteca, y tiene un puerto Java .
fuente
Puede usar la implementación de la biblioteca Shiro (anteriormente JSecurity ) de lo que describe OWASP .
También parece que la biblioteca JASYPT tiene una utilidad similar .
fuente
Puede compilar hash utilizando
MessageDigest
, pero esto es incorrecto en términos de seguridad. Los hashes no se deben usar para almacenar contraseñas, ya que son fácilmente rompibles.Debe usar otro algoritmo como bcrypt, PBKDF2 y scrypt para almacenar sus contraseñas. Vea aquí .
fuente
Además de bcrypt y PBKDF2 mencionados en otras respuestas, recomendaría mirar scrypt
MD5 y SHA-1 no se recomiendan, ya que son relativamente rápidos, por lo tanto, el uso de computación distribuida de "alquiler por hora" (por ejemplo, EC2) o una GPU moderna de alta gama puede "descifrar" las contraseñas usando ataques de fuerza bruta / diccionario en costos relativamente bajos y razonables hora.
Si debe usarlos, al menos repita el algoritmo una cantidad significativa predefinida de veces (1000+).
Consulte aquí para obtener más información: /security/211/how-to-securely-hash-passwords
Y aquí: http://codahale.com/how-to-safely-store-a-password/ (critica a la familia SHA, MD5, etc. por motivos de hash de contraseña)
fuente
Totalmente de acuerdo con Erickson en que PBKDF2 es la respuesta.
Si no tiene esa opción, o solo necesita usar un hash, Apache Commons DigestUtils es mucho más fácil que obtener el código JCE correcto: https://commons.apache.org/proper/commons-codec/apidocs/org/apache /commons/codec/digest/DigestUtils.html
Si usa un hash, vaya con sha256 o sha512. Esta página tiene buenas recomendaciones sobre el manejo y el hash de contraseñas (tenga en cuenta que no recomienda el hash para el manejo de contraseñas): http://www.daemonology.net/blog/2009-06-11-cryptographic-right-answers.html
fuente
Se podría utilizar Spring Security Crypto (tiene sólo 2 dependencias de compilación opcionales ), que apoya PBKDF2 , Bcrypt , Scrypt y ARGON2 cifrado de la contraseña.
fuente
Si bien la recomendación NIST PBKDF2 ya se ha mencionado, me gustaría señalar que hubo una competencia de hash de contraseña pública que se desarrolló entre 2013 y 2015. Al final, se eligió Argon2 como la función de hash de contraseña recomendada.
Existe un enlace de Java bastante bien adoptado para la biblioteca original (C nativa) que puede usar.
En el caso de uso promedio, no creo que importe desde una perspectiva de seguridad si elige PBKDF2 sobre Argon2 o viceversa. Si tiene requisitos de seguridad sólidos, le recomiendo considerar Argon2 en su evaluación.
Para obtener más información sobre la seguridad de las funciones de hash de contraseña, consulte security.se .
fuente
Aquí tiene dos enlaces para el hash MD5 y otros métodos de hash:
API Javadoc: https://docs.oracle.com/javase/1.5.0/docs/api/java/security/MessageDigest.html
Tutorial: http://www.twmacinta.com/myjava/fast_md5.php
fuente
Entre todos los esquemas hash estándar, LDAP ssha es el más seguro de usar,
http://www.openldap.org/faq/data/cache/347.html
Simplemente seguiría los algoritmos especificados allí y usaría MessageDigest para hacer el hash.
Necesita almacenar la sal en su base de datos como sugirió.
fuente
A partir de 2020, el algoritmo más creíble y flexible en uso,
el más probable para optimizar su fuerza dado cualquier hardware,
es Argon2id o Argon2i .
Proporciona la herramienta de calibración necesaria para encontrar parámetros de resistencia optimizados dado un tiempo de hashing objetivo y el hardware utilizado.
El hash codicioso de la memoria ayudaría contra el uso de GPU para el craqueo.
La implementación de Spring Security / Bouncy Castle no está optimizada y relativamente semana dado lo que el atacante podría usar. cf: documentación de primavera
La implementación más creíble en uso para Java es la de mkammerer ,
Un contenedor contenedor / biblioteca de la implementación nativa oficial escrita en Rust.
Está bien escrito y es fácil de usar.
La versión integrada proporciona compilaciones nativas para Linux, Windows y OSX.
Como ejemplo, es utilizado por jpmorganchase en su proyecto de seguridad tessera utilizado para asegurar Quorum , su implementación de criptomonedas Ethereum.
Aquí está el código de ejemplo de tessera.
La calibración se puede realizar usando de.mkammerer.argon2.Argon2Helper # findIterations
Los algoritmos SCRYPT y Pbkdf2 también pueden calibrarse escribiendo algunos puntos de referencia simples, pero los valores mínimos de iteraciones seguras actuales requerirán tiempos de hashing más altos.
fuente
Lo aprendí de un video en Udemy y lo edité para que sea una contraseña aleatoria más segura
fuente