Search code examples
javaencryptionbouncycastlesalt-cryptography

How to encrypt and salt the password using BouncyCastle API in Java?


I am fairly new to cryptography and I am using BouncyCasetle API to encrypt password and store it in the database. For encryption I am using SHA-1 algorithm and I want to salt the password to prevent it agains dictionary attacks.

Any help would be appreciated.


Solution

  • I'd recommend use of a Password-Based Key Derivation Function instead of a basic hash function for this. Something like this:

    // tuning parameters
    
    // these sizes are relatively arbitrary
    int seedBytes = 20;
    int hashBytes = 20;
    
    // increase iterations as high as your performance can tolerate
    // since this increases computational cost of password guessing
    // which should help security
    int iterations = 1000;
    
    // to save a new password:
    
    SecureRandom rng = new SecureRandom();
    byte[] salt = rng.generateSeed(seedBytes);
    
    Pkcs5S2ParametersGenerator kdf = new Pkcs5S2ParametersGenerator();
    kdf.init(passwordToSave.getBytes("UTF-8"), salt, iterations);
    
    byte[] hash =
        ((KeyParameter) kdf.generateDerivedMacParameters(8*hashBytes)).getKey();
    
    // now save salt and hash
    
    // to check a password, given the known previous salt and hash:
    
    kdf = new Pkcs5S2ParametersGenerator();
    kdf.init(passwordToCheck.getBytes("UTF-8"), salt, iterations);
    
    byte[] hashToCheck =
        ((KeyParameter) kdf.generateDerivedMacParameters(8*hashBytes)).getKey();
    
    // if the bytes of hashToCheck don't match the bytes of hash
    // that means the password is invalid