Java Language
Seguridad y criptografía
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