Java Language
Beveiliging en cryptografie
Zoeken…
Bereken Cryptografische Hashes
De hashes van relatief kleine gegevensblokken berekenen met behulp van verschillende algoritmen:
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)));
Produceert deze uitvoer:
MD5 hash: E99E768582F6DD5A3BA2D9C849DF736E
SHA1 hash: 0135FAA6323685BA8A8FF8D3F955F0C36949D8FB
SHA256 hash: 8D35C97BCD902B96D1B551741BBE8A7F50BB5A690B4D0225482EAA63DBFB9DED
Afhankelijk van uw implementatie van het Java-platform zijn mogelijk extra algoritmen beschikbaar.
Genereer cryptografisch willekeurige gegevens
Om monsters van cryptografisch willekeurige gegevens te genereren:
final byte[] sample = new byte[16];
new SecureRandom().nextBytes(sample);
System.out.println("Sample: " + DatatypeConverter.printHexBinary(sample));
Produceert uitvoer vergelijkbaar met:
Sample: E4F14CEA2384F70B706B53A6DF8C5EFE
Merk op dat de aanroep van nextBytes()
kan worden geblokkeerd terwijl entropie wordt verzameld, afhankelijk van het gebruikte algoritme.
Om het algoritme en de provider op te geven:
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));
Produceert uitvoer vergelijkbaar met:
Provider: SUN version 1.8
Algorithm: SHA1PRNG
Sample: C80C44BAEB352FD29FBBE20489E4C0B9
Genereer publieke / private sleutelparen
Sleutelparen genereren met verschillende algoritmen en sleutelgroottes:
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();
Extra algoritmen en sleutelgroottes zijn mogelijk beschikbaar op uw implementatie van het Java-platform.
Een willekeurige bron opgeven om te gebruiken bij het genereren van de sleutels:
final KeyPairGenerator generator = KeyPairGenerator.getInstance("RSA");
generator.initialize(2048, SecureRandom.getInstance("SHA1PRNG", "SUN"));
final KeyPair pair = generator.generateKeyPair();
Digitale handtekeningen berekenen en verifiëren
Om een handtekening te berekenen:
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();
Merk op dat het handtekeningalgoritme compatibel moet zijn met het algoritme dat wordt gebruikt om het sleutelpaar te genereren.
Om een handtekening te verifiëren:
final PublicKey publicKey = keyPair.getPublic();
final Signature verifier = Signature.getInstance("SHA1withRSA");
verifier.initVerify(publicKey);
verifier.update(data);
System.out.println("Signature: " + verifier.verify(signature));
Produceert deze uitvoer:
Signature: true
Gegevens coderen en decoderen met openbare / privésleutels
Gegevens coderen met een openbare sleutel:
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));
Produceert uitvoer vergelijkbaar met:
Message: Hello
Encrypted: 5641FBB9558ECFA9ED...
Merk op dat u bij het maken van het Cipher
object een transformatie moet opgeven die compatibel is met het type sleutel dat wordt gebruikt. (Zie JCA Standard Algorithm Names voor een lijst met ondersteunde transformaties.). Voor RSA-coderingsgegevens moet message.getBytes()
kleiner zijn dan de sleutelgrootte. Zie dit ZO antwoord voor detail.
Om de gegevens te decoderen:
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);
Produceert de volgende uitvoer:
Decrypted: Hello