¿Uso de sal para la seguridad de Spring?

4

Utilizo Spring Security para aplicaciones web Java y he escrito un proveedor de autenticación que funciona sin sal y ahora quiero agregar sal o, alternativamente, usar los algoritmos incorporados con seguridad Spring que parecen ser SHA y que pueden usar sal que se especifica con XML. En mi caso, no usé SHA pero AES y la contraseña de entrada se compara con una cadena criptográfica codificada, por ejemplo. �[�s�E� qh % "5% g" 2T $ 'que coincidirá con el back-end en este controlador.

public Authentication authenticate(Authentication authentication) throws AuthenticationException {
        String name = authentication.getName();
        String password = authentication.getCredentials().toString();
        AdministratorAccount administratorAccount = administratorAccountService.get(name);
        CryptographyProviderAES256 aes256CryptographyProvider = new CryptographyProviderAES256(256);
        byte[] mockSecretCode = new StringBuilder().append("qwertyuiqwertyui").toString().getBytes();
        byte[] encrypted = aes256CryptographyProvider.encrypt(password.getBytes(), mockSecretCode);

        //TODO: salt
        if (administratorAccount.getPassword().equals(new String(encrypted))) {
            List<GrantedAuthority> grantedAuths = new ArrayList<>();
            grantedAuths.add(new SimpleGrantedAuthority("ROLE_USER"));
            Authentication auth = new UsernamePasswordAuthenticationToken(name, password, grantedAuths);
            return auth;
        } else {
            return null;
        }
    }

¿Debo usar SHA en su lugar que está integrado con la seguridad de Spring y se puede agregar con XML en su lugar? Mi clase de cuenta tiene variables para contraseña y sal, ¿cómo debo implementar una sal? ¿Debo generar un salt de time + random al crear la cuenta de esta forma?

 final Random r = new SecureRandom();
 byte[] salt = new byte[32];
 r.nextBytes(salt);
    
pregunta Niklas Rosencrantz 18.12.2013 - 19:28
fuente

1 respuesta

6

Hazte un favor, no intentes inventar tus propias funciones de hashing de contraseñas. En el campo de la criptografía en general, y del hash de contraseña en particular, las construcciones de aficionados son casi invariablemente débiles, porque no puede probar la seguridad . Cualquier programador puede crear algún código que sea sonido , es decir, que funcione, pero ningún programador puede asegurarse de que lo que produjo es seguro .

Los criptógrafos profesionales tampoco pueden inventar algoritmos seguros por sí mismos; sin embargo, lo saben . Entonces, cuando producen un nuevo algoritmo, se lo muestran a sus compañeros criptógrafos, que hacen todo lo posible para intentar romperlo. Si el algoritmo sobrevive durante un tiempo suficiente (varios años ), entonces el algoritmo se considera "probablemente lo suficientemente seguro como para ser utilizado en la producción".

A menos que tenga su propio equipo de criptógrafos y pueda esperar algunos años, realmente necesita confiar en las funciones de hash de contraseñas existentes que se han sometido a este tratamiento y aún están vivas para hablar de ello. . Esto básicamente significa bcrypt o PBKDF2. Más detalles aquí .

Además, no uses password.getBytes() . Ese método getBytes() usa el conjunto de caracteres predeterminado, que depende de la configuración regional actual. Este método es una excelente manera de hacer código que se rompe cuando se usa en otro país. En su lugar, use un conjunto de caracteres explícito, como en password.getBytes("UTF-8") .

    
respondido por el Tom Leek 18.12.2013 - 20:53
fuente

Lea otras preguntas en las etiquetas