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


Modified text is an extract of the original Stack Overflow Documentation
Licentie onder CC BY-SA 3.0
Niet aangesloten bij Stack Overflow