Java Language
Säkerhet & kryptografi
Sök…
Beräkna kryptografiska Hashes
För att beräkna hasherna för relativt små datablock med olika algoritmer:
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)));
Producerar denna utgång:
MD5 hash: E99E768582F6DD5A3BA2D9C849DF736E
SHA1 hash: 0135FAA6323685BA8A8FF8D3F955F0C36949D8FB
SHA256 hash: 8D35C97BCD902B96D1B551741BBE8A7F50BB5A690B4D0225482EAA63DBFB9DED
Ytterligare algoritmer kan finnas tillgängliga beroende på din implementering av Java-plattformen.
Generera kryptografiskt slumpmässiga data
För att generera prover av kryptografiskt slumpmässig data:
final byte[] sample = new byte[16];
new SecureRandom().nextBytes(sample);
System.out.println("Sample: " + DatatypeConverter.printHexBinary(sample));
Producerar produktion som liknar:
Sample: E4F14CEA2384F70B706B53A6DF8C5EFE
Observera att samtalet till nextBytes()
kan blockera medan entropi samlas beroende på vilken algoritm som används.
Så här specificerar du algoritmen och leverantören:
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));
Producerar produktion som liknar:
Provider: SUN version 1.8
Algorithm: SHA1PRNG
Sample: C80C44BAEB352FD29FBBE20489E4C0B9
Generera offentliga / privata nyckelpar
Så här genererar du nyckelpar med olika algoritmer och nyckelstorlekar:
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();
Ytterligare algoritmer och nyckelstorlekar kan vara tillgängliga för din implementering av Java-plattformen.
Så här anger du en källa för slumpmässighet som ska användas när du genererar tangenterna:
final KeyPairGenerator generator = KeyPairGenerator.getInstance("RSA");
generator.initialize(2048, SecureRandom.getInstance("SHA1PRNG", "SUN"));
final KeyPair pair = generator.generateKeyPair();
Beräkna och verifiera digitala signaturer
Så här beräknar du en 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();
Observera att signaturalgoritmen måste vara kompatibel med den algoritm som används för att generera nyckelparet.
Så här kontrollerar du en 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));
Producerar denna utgång:
Signature: true
Kryptera och dekryptera data med offentliga / privata nycklar
Så här krypterar du data med en offentlig nyckel:
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));
Producerar produktion som liknar:
Message: Hello
Encrypted: 5641FBB9558ECFA9ED...
Observera att när du skapar Cipher
objektet måste du ange en transformation som är kompatibel med den typ av nyckel som används. (Se JCA-standardalgoritmnamn för en lista över stödda transformationer.). För RSA-krypteringsdatameddelandet.getBytes message.getBytes()
måste vara mindre än nyckelstorleken. Se detta SO-svar för detaljer.
Så här dekrypterar du data:
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);
Tillverkar följande utgång:
Decrypted: Hello