2016-07-31 20 views
0

zu erzeugen unzählige Stunden Nach dem Kampf habe ich endlich den aktuellen Code Arbeits CMS hüllt zu erzeugen (RSA-OAEP/PKCS # 1) Daten mit Informationen Empfänger mit JCE/JCA:Wie BouncyCastle lightwigth API verwenden cms Daten hüllt

String digest = "SHA-256"; 
String mgfDigest = "SHA-256"; 

// Data to encrypt 
CMSTypedData msg = new CMSProcessableByteArray(data); 

// Generator for my CMS enveloped data 
CMSEnvelopedDataGenerator envelopedDataGen = new CMSEnvelopedDataGenerator(); 

// Recipient Info Stuff 
JcaAlgorithmParametersConverter paramsConverter = new JcaAlgorithmParametersConverter(); 
OAEPParameterSpec oaepSpec = new OAEPParameterSpec(digest, "MGF1", new MGF1ParameterSpec(mgfDigest), PSource.PSpecified.DEFAULT); 
AlgorithmIdentifier oaepAlgId = paramsConverter.getAlgorithmIdentifier(PKCSObjectIdentifiers.id_RSAES_OAEP, oaepSpec); 
envelopedDataGen.addRecipientInfoGenerator(
     new JceKeyTransRecipientInfoGenerator(
       getCert(), 
       oaepAlgId).setProvider("BC")); 

/* 
    * Generate CMS-Data 
    * CMSOutputEncryptor is my own Class implementing OutputEncryptor 
    */ 
CMSEnvelopedData ed = envelopedDataGen.generate(
     msg, 
     new CMSOutputEncryptor()); 

byte[] encoded = ed.getEncoded(); 

Dies funktioniert wie erwartet, aber weil es JCE verwendet meine Kunden müssen die unbegrenzte Stärke API installieren, um diesen Code zu verwenden. Ich würde einen Weg bevorzugen, diese Bedürfnisse zu überwinden, weil die meisten meiner Kunden Finger sind Daumen ...

Vielleicht kann mir jemand ein Stück Code zeigen, die eine reine BouncyCastle Art und Weise, das gleiche zu tun, so dass man nicht brauchen um die unbegrenzte Stärke API zu installieren?

Antwort

0

Bitte beachten Sie, dass ich nicht sicher bin, ob dies in allen Ländern/für alle Kunden legal ist.

Wenn Sie die Einschränkung entfernen möchten, können Sie mit etwas Reflexion Magie arbeiten. Dies ist, wie ich es in meinem Rahmen (teilweise entnommen aus: https://github.com/jruby/jruby/blob/0c345e1b186bd457ebd96143c0816abe93b18fdf/core/src/main/java/org/jruby/util/SecurityHelper.java):

import java.lang.reflect.Field; 
import java.lang.reflect.Modifier; 
import java.security.NoSuchAlgorithmException; 
import javax.crypto.Cipher; 

public class UnlimitedStrengthHelper { 

    public static void removeCryptoStrengthRestriction() { 
     try { 
      if (Cipher.getMaxAllowedKeyLength("AES") < 256) { 
       Class jceSecurity = Class.forName("javax.crypto.JceSecurity"); 
       Field isRestricted = jceSecurity.getDeclaredField("isRestricted"); 
       if (Modifier.isFinal(isRestricted.getModifiers())) { 
        Field modifiers = Field.class.getDeclaredField("modifiers"); 
        modifiers.setAccessible(true); 
        modifiers.setInt(isRestricted, isRestricted.getModifiers() & ~Modifier.FINAL); 
        modifiers.setAccessible(false); 
       } 
       isRestricted.setAccessible(true); 
       isRestricted.setBoolean(null, false); 
       isRestricted.setAccessible(false); 
      } 
     } catch (ClassNotFoundException | IllegalAccessException | IllegalArgumentException 
       | NoSuchAlgorithmException | NoSuchFieldException | SecurityException ex) { 
      System.out.println("It is not possible to use unrestricted policy with this JDK, " 
        + "consider reconfiguration: " + ex.getLocalizedMessage()); 
     } 
    } 
} 

Der Code prüft zunächst, ob die Beschränkung vorhanden ist (in diesem Fall können Sie nicht mit AES256 arbeiten). Danach dauert es JceSecurity Klasse und isRestricted Feld. Es stellt sicher, dass wir auf dieses Feld zugreifen können und setzt schließlich seinen Wert auf false.

Übrigens, danke für Ihr CMS Beispiel, es hat mir sehr geholfen.

+0

Danke für diesen Code, aber AFAIK das wird nicht mehr funktionieren, weil die statischen Felder jetzt endlich sind. Bitte werfen Sie einen Blick auf https://github.com/jruby/jruby/issues/4101. Am Ende habe ich beschlossen, eine volle Java JRE mit unbegrenzter Stärke API aktiviert zu liefern. Aber gut zu wissen, dass mein Code eine Hilfe für dich war. –

+0

Diese Zeile setzt den Modifikator auf nicht-final: modifiers.setInt (isRestricted, isRestricted.getModifiers() & ~ Modifier.FINAL); – Juraj