Beispiel 7.24. 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[]{
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.25. Setzen eines CryptoMaterialProviders
Das Beispiel zeigt wie der in Beispiel 7.24, „Beispielimplementierung eines CryptoMaterialProviders“ 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.26. 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) |

