Buscar..


Calcular los hash criptográficos

Para calcular los hashes de bloques de datos relativamente pequeños utilizando diferentes algoritmos:

final MessageDigest md5 = MessageDigest.getInstance("MD5");
final MessageDigest sha1 = MessageDigest.getInstance("SHA-1");
final MessageDigest sha256 = MessageDigest.getInstance("SHA-256");

final byte[] data = "FOO BAR".getBytes();

System.out.println("MD5    hash: " + DatatypeConverter.printHexBinary(md5.digest(data)));
System.out.println("SHA1   hash: " + DatatypeConverter.printHexBinary(sha1.digest(data)));
System.out.println("SHA256 hash: " + DatatypeConverter.printHexBinary(sha256.digest(data)));

Produce esta salida:

MD5    hash: E99E768582F6DD5A3BA2D9C849DF736E
SHA1   hash: 0135FAA6323685BA8A8FF8D3F955F0C36949D8FB
SHA256 hash: 8D35C97BCD902B96D1B551741BBE8A7F50BB5A690B4D0225482EAA63DBFB9DED

Es posible que haya algoritmos adicionales disponibles según su implementación de la plataforma Java.

Generar datos criptográficamente aleatorios

Para generar muestras de datos criptográficamente aleatorios:

final byte[] sample = new byte[16];

new SecureRandom().nextBytes(sample);

System.out.println("Sample: " + DatatypeConverter.printHexBinary(sample));

Produce una salida similar a:

Sample: E4F14CEA2384F70B706B53A6DF8C5EFE

Tenga en cuenta que la llamada a nextBytes() puede bloquearse mientras se recopila la entropía según el algoritmo que se esté utilizando.

Para especificar el algoritmo y el proveedor:

final byte[] sample = new byte[16];
final SecureRandom randomness = SecureRandom.getInstance("SHA1PRNG", "SUN");

randomness.nextBytes(sample);

System.out.println("Provider: " + randomness.getProvider());
System.out.println("Algorithm: " + randomness.getAlgorithm());
System.out.println("Sample: " + DatatypeConverter.printHexBinary(sample));

Produce una salida similar a:

Provider: SUN version 1.8
Algorithm: SHA1PRNG
Sample: C80C44BAEB352FD29FBBE20489E4C0B9

Generar pares de claves públicas / privadas

Para generar pares de claves utilizando diferentes algoritmos y tamaños de clave:

final KeyPairGenerator dhGenerator = KeyPairGenerator.getInstance("DiffieHellman");
final KeyPairGenerator dsaGenerator = KeyPairGenerator.getInstance("DSA");
final KeyPairGenerator rsaGenerator = KeyPairGenerator.getInstance("RSA");

dhGenerator.initialize(1024);
dsaGenerator.initialize(1024);
rsaGenerator.initialize(2048);

final KeyPair dhPair = dhGenerator.generateKeyPair();
final KeyPair dsaPair = dsaGenerator.generateKeyPair();
final KeyPair rsaPair = rsaGenerator.generateKeyPair();

Es posible que haya algoritmos adicionales y tamaños de clave disponibles en su implementación de la plataforma Java.

Para especificar una fuente de aleatoriedad para usar al generar las claves:

final KeyPairGenerator generator = KeyPairGenerator.getInstance("RSA");

generator.initialize(2048, SecureRandom.getInstance("SHA1PRNG", "SUN"));

final KeyPair pair = generator.generateKeyPair();

Calcular y verificar firmas digitales

Para calcular una firma:

final PrivateKey privateKey = keyPair.getPrivate();
final byte[] data = "FOO BAR".getBytes();
final Signature signer = Signature.getInstance("SHA1withRSA");

signer.initSign(privateKey);
signer.update(data);

final byte[] signature = signer.sign();

Tenga en cuenta que el algoritmo de firma debe ser compatible con el algoritmo utilizado para generar el par de claves.

Para verificar una firma:

final PublicKey publicKey = keyPair.getPublic();
final Signature verifier = Signature.getInstance("SHA1withRSA");

verifier.initVerify(publicKey);
verifier.update(data);

System.out.println("Signature: " + verifier.verify(signature));

Produce esta salida:

Signature: true

Cifrar y descifrar datos con claves públicas / privadas

Para cifrar los datos con una clave pública:

final Cipher rsa = Cipher.getInstance("RSA");

rsa.init(Cipher.ENCRYPT_MODE, keyPair.getPublic());
rsa.update(message.getBytes());
final byte[] result = rsa.doFinal();

System.out.println("Message: " + message);
System.out.println("Encrypted: " + DatatypeConverter.printHexBinary(result));

Produce una salida similar a:

Message: Hello
Encrypted: 5641FBB9558ECFA9ED...

Tenga en cuenta que al crear el objeto Cipher , debe especificar una transformación que sea compatible con el tipo de clave que se está utilizando. (Consulte Nombres de algoritmos estándar JCA para obtener una lista de las transformaciones admitidas). Para los datos de cifrado RSA, la longitud de message.getBytes() debe ser menor que el tamaño de la clave. Vea esta respuesta SO para detalles.

Para descifrar los datos:

final Cipher rsa = Cipher.getInstance("RSA");

rsa.init(Cipher.DECRYPT_MODE, keyPair.getPrivate());
rsa.update(cipherText);
final String result = new String(rsa.doFinal());

System.out.println("Decrypted: " + result);

Produce la siguiente salida:

Decrypted: Hello


Modified text is an extract of the original Stack Overflow Documentation
Licenciado bajo CC BY-SA 3.0
No afiliado a Stack Overflow