Pregunta

En una pila de aplicaciones Java con Spring & Hibernate (JPA) en la capa de acceso a datos, ¿cuáles son buenos métodos para aplicar el cifrado de contraseña (con suerte usando anotaciones) y dónde puede encontrar más información sobre cómo hacerlo (tutorial, etc.)?

Se entiende que usaría un JCA Algoritmo admitido para cifrar las contraseñas, pero preferiría no tener que implementar la lógica contenedora si hay una manera fácil.

Estaba mirando Jasypt y a) me preguntaba si es una buena opción y cómo hacerlo yb) qué más está usando la gente para esto.Si alguien está usando Jasypt o una alternativa, sería fantástico contar detalles de su experiencia.

¿Fue útil?

Solución

Java tiene todas las bibliotecas necesarias ya previstos para usted. Basta con crear un método de utilidad que implementa hash con una sal como se describe en OWASP .

Si usted realmente no quiere ser dueño de ese código y no le importa una dependencia adicional, parece que la biblioteca Shiro (anteriormente JSecurity ) tiene un aplicación de lo que se describe por OWASP.

También se parece a la biblioteca Jasypt usted ha mencionado tiene un utilidad similar .

Me doy cuenta de que esta respuesta no menciona la primavera o hibernación, pero no estoy claro cómo usted está esperando para utilizarlos en este escenario.

Otros consejos

Puede utilizar Jasypt con Hibernate para cifrar o hash de sus propiedades sobre la marcha si eso es lo estas buscando. El algoritmo para calcular digiere real (hash) es realmente simple usando la JCE si quieres rodar su propia también.

MD5 o SHA-256 estaría bien, aunque MD5 es crackable ahora.

Tal vez no he entendido bien el problema, pero debería ser simplemente comparando las contraseñas hash.

En hibernación, simplemente almacenar como una cadena. Por el lado de la validación, tener un método como:

public validate(String user, String pass)
{
    if(getUser(user).getPass().equals(getHash(pass)))
        return true;
    return false;
}

No parece ser una forma específica de Hibernate hacerlo con Jasypt, pero se puede establecer un encriptador contraseña en primavera:

  <!-- 
   Set up string digester here so we can configure it for more pools if it's a problem... 
  -->
  <bean id="stringDigester" class="org.jasypt.digest.PooledStringDigester">
    <!-- same settings as StrongPasswordGenerator -->
    <property name="poolSize" value="2"/>
    <property name="algorithm" value="SHA-256"/>
    <property name="iterations" value="100000"/>
    <property name="saltGenerator">
      <bean class="org.jasypt.salt.RandomSaltGenerator"/>
    </property>
    <property name="saltSizeBytes" value="16"/>
  </bean>

  <!-- ...and then we only have to deal with the passwordEncryptor interface in code. -->
  <bean id="passwordEncryptor" class="com.myproject.util.StringPasswordEncryptor">
    <property name="stringDigester" ref="stringDigester"/>
  </bean>

Después de eso, se llama a context.getBean ( "passwordEncryptor") para obtener el dispositivo de cifrado, y luego llamar a cualquiera EncryptPassword () o checkPassword ().

Si está utilizando la primavera en su aplicación, a continuación, también se puede utilizar Spring Security , que le proporciona varios codificadores de contraseña, es decir, ShaPasswordEncoder Lo puede encontrar en Stackoverflow

Sólo uso algo similar a SHA-256(username + ":" + password + ":" + salt) y guárdelo en la base de datos en una columna de 64 caracteres llamada passwd.

Wikipedia dice, en relación con las sales:"Los datos de Salt complican los ataques de diccionario que utilizan el cifrado previo de las entradas del diccionario:cada bit de sal utilizado duplica la cantidad de almacenamiento y cálculo necesarios....Para mayor seguridad, el valor de la sal se mantiene en secreto, separado de la base de datos de contraseñas.Esto proporciona una ventaja cuando se roba una base de datos, pero no la sal".

Entonces, para autenticarse, obtenga el usuario de la base de datos con el nombre de usuario proporcionado, luego genere el mismo hash usando la contraseña proporcionada en su intento de inicio de sesión y compárelo con el de la base de datos.También agregue algunas limitaciones de velocidad para los intentos de inicio de sesión (por ejemplo, 5 por período de 5 minutos).Si el usuario olvida su contraseña, NUNCA le envíe por correo electrónico la contraseña (ya que no la almacenará), ni le envíe por correo electrónico una nueva contraseña generada, sino un enlace para cambiar esa contraseña con un cambio de clave de contraseña/nonce/salt en la URL con la que puedes comparar.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top