Pergunta

Em uma pilha de aplicativos Java com Spring & Hibernate (JPA) na camada de acesso de dados, que são bons métodos de aplicação da criptografia de senha (espero usando anotações), e onde você pode descobrir mais sobre começá-lo feito (tutorial, etc)?

Entende-se que eu iria usar um JCA algoritmo suportado para criptografar as senhas, mas eu preferiria não ter que implementar a lógica invólucro se existe uma maneira fácil.

Eu estava olhando para Jasypt, e foi a) perguntando se isso é uma opção boa e como fazê-lo e b) o que as pessoas outra pessoa está usando para isso. Se alguém está usando Jasypt ou uma alternativa, detalhes de sua experiência seria ótimo.

Foi útil?

Solução

Java tem todas as bibliotecas necessárias já previstas para você. Basta criar um método de utilidade que implementa hash com um sal, tal como descrito em OWASP .

Se você realmente não quer ter esse código e não se importa uma dependência extra, parece que o Shiro biblioteca (anteriormente JSecurity ) tem uma implementação do que é descrito por OWASP.

Também parece que a biblioteca JASYPT você mencionou tem uma semelhante utilidade .

Eu percebo que esta resposta não menciona Primavera ou hibernação mas eu não sou claro como você está esperando para utilizá-los neste cenário.

Outras dicas

Você pode usar Jasypt com Hibernate para criptografar ou hash de suas propriedades na mosca se é isso que você está procurando. O algoritmo real para computação digere (hashes) é simples bonita usando o JCE se você desejar construir sua própria também.

MD5 ou SHA-256 seria bom, embora MD5 é atacada agora.

Talvez eu mal o problema, mas deve ser apenas comparando hash de senhas.

Em hibernação, apenas armazenar como uma String. Do lado da validação, tem um método como:

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

Não parece ser uma maneira específica Hibernate fazê-lo com Jasypt, mas você pode configurar um codificador senha na 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>

Depois disso, você chamar context.getBean ( "passwordEncryptor") para obter o codificador, e em seguida, chamar qualquer EncryptPassword () ou checkPassword ().

Se você estiver usando Primavera em sua aplicação, então você também pode usar Spring Security , que lhe proporciona vários codificadores de senha, ou seja, ShaPasswordEncoder Você pode encontrá-lo no StackOverflow

Eu só usar algo semelhante ao SHA-256(username + ":" + password + ":" + salt) e armazená-lo no banco de dados em uma coluna de 64 caracteres chamado passwd.

Wikipedia diz, relativo a sais: "Dados Sal complica ataques de dicionário que usam pré-criptografia de entradas do dicionário:. Cada bit de duplas de sal utilizada a quantidade de armazenamento e computação necessários ... Para melhor segurança, o valor sal é segredo mais bem guardado, separar o banco de dados de senha. Isto proporciona uma vantagem quando um banco de dados for roubado, mas o sal não é ".

Assim, para autenticar, obter usuário de banco de dados com nome de usuário fornecido, em seguida, gerar o mesmo hash usando a senha fornecida através de sua tentativa de login, e comparar com a do banco de dados. Também adicionar em algum limitante da velocidade para tentativas de acesso (por exemplo, 5 por 5 minutos de período). Se o usuário esquecer sua senha, NUNCA enviá-las a senha (como você não vai tê-lo armazenado), nem enviá-las uma nova senha gerada, mas enviá-las um link para alterar essa senha com uma chave de alteração de senha / nonce / sal a URL que você pode verificar contra.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top