Uso di sale per la sicurezza di primavera?

4

Uso la sicurezza Spring per le applicazioni Web Java e ho scritto un provider di autenticazione che funziona senza sale e ora voglio aggiungere sale o in alternativa utilizzare gli algoritmi incorporati con la sicurezza Spring che sembra essere SHA e che possono usare salt che è specificato con XML. Nel mio caso non ho usato SHA ma AES e la password di input è abbinata alla stringa crittografica che è stata codificata, ad es. �[�s�E� qh % "5% g" 2T $ 'che corrisponderà al back-end in questo gestore.

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;
        }
    }

Dovrei usare SHA invece che è integrato con Spring Security e che può essere aggiunto con XML? La mia classe Account ha variabili per password e sale, come dovrei implementare un salt? Devo generare un tempo di sale + casuale durante la creazione dell'account in questo modo:

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

1 risposta

6

Fai un favore a te stesso, non provare a inventare le tue funzioni di hashing della password. Nel campo della crittografia in generale e dell'hash delle password in particolare, le costruzioni amatoriali sono quasi invariabilmente deboli, perché non puoi testare per sicurezza . Qualsiasi programmatore può creare un codice che sia suono , cioè che funziona, ma nessun programmatore può assicurarsi che ciò che ha prodotto sia sicuro .

I crittografi professionisti non possono inventare da soli algoritmi sicuri; tuttavia, lo sanno . Quindi, quando producono un nuovo algoritmo, lo mostrano ai loro colleghi crittografi, che fanno del loro meglio per cercare di romperlo. Se l'algoritmo sopravvive per un tempo sufficiente (diversi anni ), allora l'algoritmo è considerato "probabilmente abbastanza sicuro da essere utilizzato in produzione".

A meno che tu non abbia il tuo team di crittografi e possa permettersi di aspettare qualche anno, devi davvero affidarti alle funzioni di hashing della password esistenti che hanno subito questo trattamento e sono ancora vivi per parlarne . Ciò significa fondamentalmente bcrypt o PBKDF2. Maggiori dettagli qui .

Inoltre, non utilizzare password.getBytes() . Quel metodo getBytes() utilizza il set di caratteri predefinito, che dipende dalle impostazioni locali correnti. Questo metodo è un ottimo modo per creare codice che si interrompe quando viene utilizzato in un altro Paese. Utilizza invece un set di caratteri esplicito, come in password.getBytes("UTF-8") .

    
risposta data 18.12.2013 - 20:53
fonte

Leggi altre domande sui tag