Beispiel zur Verwendung der PDF Security API

Beispiel 7.23. Beispielimplementierung eines CryptoMaterialProviders

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[]{                                                  (1)
          new PasswordMaterial("foo"), //
          new PasswordMaterial("bar"), //
          new PasswordMaterial("foobar")
      };
  
  @Override
  public void provide(CryptoMaterialReceiver<PasswordMaterial> receiver) {
    for(PasswordMaterial companyPassword : companyPasswords) {                 (2)
      if(receiver.receive(companyPassword))                                    (3)
        return;                                                                (4)
    }
    
    receiver.cancel();                                                         (5)
  }
}

1

Beispielpasswörter.

2

Durchlaufen jedes Passworts

3

Überprüfung des Passworts. Wenn der Receiver das Passwort autorisiert hat, wird 'true' zurückgegeben. Das PDF kann entschlüsselt werden.

4

Die Methode kann verlassen werden. Der Receiver hat das Passwort zur weiteren Verarbeitung an den SecurityHandler bereits weitergegeben.

5

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 CryptoMaterialProviders

Das Beispiel zeigt wie der in Beispiel 7.23, „Beispielimplementierung eines CryptoMaterialProviders“ implementierte CryptoMaterialProvider beim Ladevorgang verfügbar gemacht wird.

Reader reader = new Reader();

PDFStandardSecurityHandlerSettings settings =  
    reader.getSettings(PDFStandardSecurityHandlerSettings.class);              (1)
settings.setCryptoMaterialProvider(new CompanyPasswordsProvider());            (2)
// reader.read(..)

1

Anfrage des Konfigurations-Objekts

2

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)
  // 1) Default case: Ensure that regular 128 Bit Keys work as expected

  byte[] key = new byte[16];                                                   (2)
  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];                                                          (3)
  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();
  }
}

1

Input (Sollte ein Vielfaches von 16 Bytes sein)

2

Erzeugung eines Schlüssels mit 16 Byte (128 Bit)

3

Erzeugung eines Schlüssels mit 32 Byte (256 Bit)


[jadice document platform Version 5.5.12.1: Dokumentation für Entwickler. Veröffentlicht: 2021-08-17]