Java Language
Sicherheit & Kryptographie
Suche…
Kryptographische Hashes berechnen
Um die Hashwerte relativ kleiner Datenblöcke mit verschiedenen Algorithmen zu berechnen:
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)));
Produziert diese Ausgabe:
MD5 hash: E99E768582F6DD5A3BA2D9C849DF736E
SHA1 hash: 0135FAA6323685BA8A8FF8D3F955F0C36949D8FB
SHA256 hash: 8D35C97BCD902B96D1B551741BBE8A7F50BB5A690B4D0225482EAA63DBFB9DED
Abhängig von Ihrer Implementierung der Java-Plattform sind möglicherweise weitere Algorithmen verfügbar.
Kryptografisch zufällige Daten erzeugen
So erstellen Sie Stichproben kryptographisch zufälliger Daten:
final byte[] sample = new byte[16];
new SecureRandom().nextBytes(sample);
System.out.println("Sample: " + DatatypeConverter.printHexBinary(sample));
Erzeugt eine Ausgabe ähnlich wie:
Sample: E4F14CEA2384F70B706B53A6DF8C5EFE
Beachten Sie, dass der Aufruf von nextBytes()
blockieren kann, während Entropie gesammelt wird, abhängig vom verwendeten Algorithmus.
So legen Sie den Algorithmus und den Anbieter fest:
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));
Erzeugt eine Ausgabe ähnlich wie:
Provider: SUN version 1.8
Algorithm: SHA1PRNG
Sample: C80C44BAEB352FD29FBBE20489E4C0B9
Generieren Sie öffentliche / private Schlüsselpaare
So erstellen Sie Schlüsselpaare mit unterschiedlichen Algorithmen und Schlüsselgrößen:
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();
Zusätzliche Algorithmen und Schlüsselgrößen sind möglicherweise in Ihrer Implementierung der Java-Plattform verfügbar.
So legen Sie eine Zufallsquelle fest, die beim Generieren der Schlüssel verwendet werden soll:
final KeyPairGenerator generator = KeyPairGenerator.getInstance("RSA");
generator.initialize(2048, SecureRandom.getInstance("SHA1PRNG", "SUN"));
final KeyPair pair = generator.generateKeyPair();
Digitale Signaturen berechnen und überprüfen
So berechnen Sie eine Signatur:
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();
Beachten Sie, dass der Signaturalgorithmus mit dem zur Generierung des Schlüsselpaares verwendeten Algorithmus kompatibel sein muss.
So überprüfen Sie eine Signatur:
final PublicKey publicKey = keyPair.getPublic();
final Signature verifier = Signature.getInstance("SHA1withRSA");
verifier.initVerify(publicKey);
verifier.update(data);
System.out.println("Signature: " + verifier.verify(signature));
Produziert diese Ausgabe:
Signature: true
Verschlüsseln und Entschlüsseln von Daten mit öffentlichen / privaten Schlüsseln
So verschlüsseln Sie Daten mit einem öffentlichen Schlüssel:
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));
Erzeugt eine Ausgabe ähnlich wie:
Message: Hello
Encrypted: 5641FBB9558ECFA9ED...
Beachten Sie, dass Sie beim Erstellen des Cipher
Objekts eine Transformation angeben müssen, die mit dem verwendeten Schlüsseltyp kompatibel ist. (Eine Liste der unterstützten Transformationen finden Sie unter Namen der JCA-Standardalgorithmen .) Bei RSA-Verschlüsselungsdaten muss die Länge von message.getBytes()
kleiner als die Schlüsselgröße sein. Siehe diese SO-Antwort für Details.
So entschlüsseln Sie die Daten:
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);
Erzeugt die folgende Ausgabe:
Decrypted: Hello