Domanda

In una pila applicazione Java con la Primavera e Hibernate (JPA) nel Data Access Layer, quali sono buoni metodi di applicazione della crittografia della password (si spera con le annotazioni), e dove si possono trovare maggiori informazioni su sempre fatto (tutorial, ecc)?

Si è capito che avrei usato un JCA algoritmo supportato per la crittografia delle password, ma io preferirei non dover implementare la logica involucro se non v'è un modo semplice.

Stavo guardando Jasypt, ed è stato a) chiedendo se questa è una buona opzione e come farlo e b) ciò che le persone stanno usando altro per questo. Se qualcuno sta usando Jasypt o in alternativa, i dettagli della vostra esperienza sarebbe bello.

È stato utile?

Soluzione

Java ha tutte le librerie necessarie già previsti per voi. È sufficiente creare un metodo di utilità che implementa hashing con un sale, come descritto in OWASP .

Se davvero non si vuole proprio che il codice e non mente una dipendenza in più, sembra che il Shiro biblioteca (ex JSecurity ) ha un implementazione di ciò che viene descritto da OWASP.

Sembra inoltre che la biblioteca JASYPT lei ha citato ha una simile utility .

Mi rendo conto che questa risposta non menziona primavera o Hibernate, ma io non sono chiaro come si spera di utilizzarle in questo scenario.

Altri suggerimenti

È possibile utilizzare Jasypt con Hibernate per crittografare o hash vostre proprietà al volo se è ciò che stai cercando. L'algoritmo per il calcolo effettivo digerisce (hash) è piuttosto semplice utilizzando il JCE, se si desidera ripristinare il proprio così.

MD5 o SHA-256 sarebbe bene, anche se MD5 è crackable ora.

Forse ho capito male il problema, ma dovrebbe essere solo confrontando le password hash.

In ibernazione, solo memorizzare come stringa. Sul lato di convalida, hanno un metodo come:

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

Non sembra essere un modo specifico Hibernate di farlo con Jasypt, ma è possibile impostare una password di criptato in 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>

Dopo di che, si chiama context.getBean ( "passwordEncryptor") per ottenere il criptato, e quindi chiamare o encryptPassword () o checkpassword ().

Se si utilizza Primavera nell'applicazione, allora si può anche utilizzare Primavera di sicurezza , che vi dà più encoder di password, vale a dire ShaPasswordEncoder Lo si può trovare su StackOverflow

mi basta usare qualcosa di simile a SHA-256(username + ":" + password + ":" + salt) e memorizzarlo nel database in una colonna di 64 caratteri chiamato passwd.

Wikipedia dice, in materia di sali: "Dati Salt complica attacchi del dizionario che utilizzano pre-crittografia di voci del dizionario:. Ogni bit di sale utilizzato raddoppia la quantità di storage e di calcolo necessaria ... Per una migliore sicurezza, il valore sale è tenuto segreto, separato dal database delle password. Ciò fornisce un vantaggio quando un database è stato rubato, ma il sale non è ".

Quindi, per l'autenticazione, ottenere utente dal database con nome utente in dotazione, quindi generare lo stesso hash utilizzando la password fornita tramite il loro tentativo di accesso, e paragonata a quella del database. Anche aggiungere in qualche limitazione della velocità per i tentativi di accesso (ad esempio, 5 per 5 epoca minuto). Se l'utente dimentica la propria password, e-mail MAI loro la password (come non avrete esso memorizzati), né inviare ai clienti una nuova password generata, ma e-mail un link a cambiare tale password con una chiave modifica della password / nonce / sale l'URL che è possibile controllare contro.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top