pbkdf2withhmacsha1 - Implementación confiable de PBKDF2-HMAC-SHA256 para JAVA
pbkdf2withhmacsha1 online (3)
Está disponible en Java 8:
public static byte[] getEncryptedPassword(
String password,
byte[] salt,
int iterations,
int derivedKeyLength
) throws NoSuchAlgorithmException, InvalidKeySpecException {
KeySpec spec = new PBEKeySpec(
password.toCharArray(),
salt,
iterations,
derivedKeyLength * 8
);
SecretKeyFactory f = SecretKeyFactory.getInstance("PBKDF2WithHmacSHA256");
return f.generateSecret(spec).getEncoded();
}
¿Existe alguna implementación confiable de PBKDF2-HMAC-SHA256 para JAVA?
Solía encriptar usando bouncycastle pero no proporciona PBKDF2WithHmacSHA256 ''.
No quiero escribir el módulo criptográfico por mi cuenta.
¿Podría recomendar alguna biblioteca o algoritmo alternativo (si puedo seguir con bouncycastle)?
(Aquí están los algoritmos que soporta bouncycastle) http://www.bouncycastle.org/specifications.html
Usando las clases de BouncyCastle directamente:
PKCS5S2ParametersGenerator gen = new PKCS5S2ParametersGenerator(new SHA256Digest());
gen.init("password".getBytes("UTF-8"), "salt".getBytes(), 4096);
byte[] dk = ((KeyParameter) gen.generateDerivedParameters(256)).getKey();
Usando spongycastle (java en android)
Reemplace spongycastle con bouncycastle si está usando bouncycastle en java directamente
import org.spongycastle.crypto.generators.PKCS5S2ParametersGenerator;
import org.spongycastle.crypto.digests.SHA256Digest;
import org.spongycastle.crypto.params.KeyParameter;
public class Crypto {
public String pbkdf2(String secret, String salt, int iterations, int keyLength) {
PKCS5S2ParametersGenerator gen = new PKCS5S2ParametersGenerator(new SHA256Digest());
byte[] secretData = secret.getBytes();
byte[] saltData = salt.getBytes();
gen.init(secretData, saltData, iterations);
byte[] derivedKey = ((KeyParameter)gen.generateDerivedParameters(keyLength * 8)).getKey();
return toHex(derivedKey);
}
private static String toHex(byte[] bytes) {
BigInteger bi = new BigInteger(1, bytes);
return String.format("%0" + (bytes.length << 1) + "x", bi);
}
}