Beispiel 7.23. Beispielimplementierung eines CryptoMaterialProvider
s
In diesem Beispiel wird gezeigt, wie ein CryptoMaterialProvider
implementiert werden kann. Dabei werden drei Passwörter definiert und es wird
eine sequenzielle Autorisierung versucht.
import com.levigo.jadice.format.pdf.crypt.CryptoMaterialProvider; import com.levigo.jadice.format.pdf.crypt.CryptoMaterialReceiver; import com.levigo.jadice.format.pdf.crypt.standard.PasswordMaterial; public class CompanyPasswordsProvider implements CryptoMaterialProvider<PasswordMaterial> { private static final PasswordMaterial[] companyPasswords = new PasswordMaterial[]{ new PasswordMaterial("foo"), // new PasswordMaterial("bar"), // new PasswordMaterial("foobar") }; @Override public void provide(CryptoMaterialReceiver<PasswordMaterial> receiver) { for(PasswordMaterial companyPassword : companyPasswords) { if(receiver.receive(companyPassword)) return; } receiver.cancel(); } }
|
Beispielpasswörter. |
|
Durchlaufen jedes Passworts |
|
Überprüfung des Passworts. Wenn der Receiver das Passwort autorisiert hat, wird 'true' zurückgegeben. Das PDF kann entschlüsselt werden. |
|
Die Methode kann verlassen werden. Der Receiver hat das Passwort zur weiteren Verarbeitung an den SecurityHandler bereits weitergegeben. |
|
Abbruch der Übermittlung des Passworts. Wenn die Autorisierung eines der drei vordefinierten Passwörter nicht erfolgreich war, muss ein Abbruch signalisiert werden. |
Beispiel 7.24. Setzen eines CryptoMaterialProvider
s
Das Beispiel zeigt wie der in Beispiel 7.23, „Beispielimplementierung eines CryptoMaterialProvider
s“ implementierte
CryptoMaterialProvider
beim Ladevorgang verfügbar gemacht wird.
Reader reader = new Reader();
PDFStandardSecurityHandlerSettings settings =
reader.getSettings(PDFStandardSecurityHandlerSettings.class);
settings.setCryptoMaterialProvider(new CompanyPasswordsProvider());
// reader.read(..)
|
Anfrage des Konfigurations-Objekts |
|
Setzen des Providers aus vorangegangenem Beispiel |
Beispiel 7.25. JCE Policy Check
Beispielhafte Prüfung ob eine Java VM die Voraussetzungen für Verschlüsselungsverfahren mit Schlüssellängen von 128 Bit und 256 Bit erfüllt.
public static void main(String[] args) throws Exception { String algorithm = "AES"; byte[] input = "0123456789ABCDEF".getBytes("UTF-8"); // 1) Default case: Ensure that regular 128 Bit Keys work as expected byte[] key = new byte[16]; try { SecretKeySpec skeySpec = new SecretKeySpec(key, algorithm); Cipher cipher = Cipher.getInstance("AES/ECB/NoPadding"); cipher.init(Cipher.DECRYPT_MODE, skeySpec); cipher.doFinal(input); System.out.println("128 Bit AES keys work as expected. This is the default."); } catch (InvalidKeyException e) { System.out.println("128 Bit AES keys don't work. This is unexpected. We have a fundamental problem here."); e.printStackTrace(); } // 2) Find out whether or not 256 Bit Keys are available key = new byte[32]; try { SecretKeySpec skeySpec = new SecretKeySpec(key, algorithm); Cipher cipher = Cipher.getInstance("AES/ECB/NoPadding"); cipher.init(Cipher.DECRYPT_MODE, skeySpec); cipher.doFinal(input); System.out.println("256 Bit AES keys work as expected."); } catch (InvalidKeyException e) { System.out.println("256 Bit AES keys don't work. Unfortunately this is the default."); e.printStackTrace(); } }
|
Input (Sollte ein Vielfaches von 16 Bytes sein) |
|
Erzeugung eines Schlüssels mit 16 Byte (128 Bit) |
|
Erzeugung eines Schlüssels mit 32 Byte (256 Bit) |