Warum java.security.NoSuchProviderException Kein solcher Anbieter: BC?


75

Das jar (bcprov-jdk16-145.jar) wurde dem Projekt Security.addProvider(new org.bouncycastle.jce.provider.BouncyCastleProvider())hinzugefügt, wurde der Klasse hinzugefügt und BouncyCastleProvider.PROVIDER_NAMEgibt "BC" zurück, aber AesFileIo.writeFile () löst immer noch aus java.security.NoSuchProviderException No such provider: BC. Irgendwelche Ideen?

import java.io.FileOutputStream;
import java.io.InputStreamReader;
import java.io.ObjectOutputStream;
import javax.crypto.Cipher;
import javax.crypto.spec.IvParameterSpec;
import javax.crypto.spec.SecretKeySpec;
import org.bouncycastle.jce.provider.BouncyCastleProvider;

public class AesFileIo {

    private static final String AES_ALGORITHM = "AES/CTR/NoPadding";
    private static final String PROVIDER = BouncyCastleProvider.PROVIDER_NAME;
    private static final byte[] AES_KEY_128 = { // Hard coded for now
        78, -90, 42, 70, -5, 20, -114, 103,
        -99, -25, 76, 95, -85, 94, 57, 54};
    private static final byte[] IV = { // Hard coded for now
        -85, -67, -5, 88, 28, 49, 49, 85,
        114, 83, -40, 119, -65, 91, 76, 108};
    private static final SecretKeySpec secretKeySpec =
            new SecretKeySpec(AES_KEY_128, "AES");
    private static final IvParameterSpec ivSpec = new IvParameterSpec(IV);

    public void AesFileIo() {
        Security.addProvider(new org.bouncycastle.jce.provider
                .BouncyCastleProvider());
    }

    public void writeFile(String fileName, String theFile) {
        try {
            Cipher cipher = Cipher.getInstance(AES_ALGORITHM, PROVIDER);
            cipher.init(Cipher.ENCRYPT_MODE, secretKeySpec, ivSpec);
            byte[] encrypted = cipher.doFinal(theFile.getBytes());
            ObjectOutputStream os = new ObjectOutputStream(
                new FileOutputStream(fileName));
            os.write(encrypted);
            os.flush();
            os.close();
        } catch (Exception e) {
            StackTraceElement se = new Exception().getStackTrace()[0];
            System.err.println(se.getFileName() + " " + se.getLineNumber()
                    + " " + e);
        }
    }
}

Bitte verweisen Sie auf diesen Link, stackoverflow.com/questions/39097099/…
varotariya vajsi

Antworten:


128

Ich bin nicht sehr vertraut mit dem Android SDK, aber es scheint, dass der android-sdkmit dem BouncyCastleAnbieter bereits zur Sicherheit hinzugefügt kommt .

In der PC-Umgebung müssen Sie es nur manuell hinzufügen.

Security.addProvider(new org.bouncycastle.jce.provider.BouncyCastleProvider());

Wenn Sie Zugriff auf die policyDatei haben, fügen Sie einfach einen Eintrag wie folgt hinzu:

security.provider.5=org.bouncycastle.jce.provider.BouncyCastleProvider 

Beachten .5Sie, dass dies einer fortlaufenden Anzahl der bereits hinzugefügten Anbieter entspricht.


Muss dies für alle PCs, auf denen diese Anwendung ausgeführt wird, manuell zur PC-Umgebung hinzugefügt werden, oder kann dies programmgesteuert durchgeführt werden (bcprov-jdk16-145.jar wurde dem Projekt bereits hinzugefügt)?
Jacknad

2
Sie müssen das Security.addProviderin Ihrem Code codieren, nur um sicherzustellen, dass es geladen ist, und vielleicht müssen Sie Ihr jarzu Ihrem Projekt hinzufügen :)
Garis M Suero

Ich habe private static final String PROVIDER = BouncyCastleProvider.PROVIDER_NAMEals Feld im Code ein Feld hinzugefügt (das in "BC" aufgelöst wird), und ich habe das JAR zum Projekt hinzugefügt, aber weiterhin erhalten java.security.NoSuchProviderException: No such provider: BC. Ich werde meine ursprüngliche Frage bearbeiten, indem ich die gesamte Klasse einbeziehe.
Jacknad

Ich habs. Benötigt Cipher cipher = Cipher.getInstance(AES_ALGORITHM);eher als Cipher cipher = Cipher.getInstance(AES_ALGORITHM, PROVIDER);. Ich nehme an, die Security.addProvider(new org.bouncycastle.jce.provider.BouncyCastleProvider());Kräfte das "BC" und das Cipher.getInstance(AES_ALGORITHM, PROVIDER);wird in diesem Zusammenhang einfach nicht verstanden.
Jacknad

Funktioniert, wenn BC 1.38 eine "java.security.NoSuchProviderException: kein solcher Anbieter: BC" in der Zeile 'CertStore certStore = cmssignedData.getCertificatesAndCRLs ("Collection", "BC");'
Broken_Window

14

Sie können einen Sicherheitsanbieter hinzufügen, indem Sie java.security bearbeiten, indem Sie security.provider. = org.bouncycastle.jce.provider.BouncyCastleProvider hinzufügen

oder fügen Sie eine Zeile in Ihrer Klasse hinzu

Security.addProvider(new BouncyCastleProvider());

Sie können die folgende Zeile verwenden, um den Anbieter anzugeben, während Sie Algorithmen angeben

Cipher cipher = Cipher.getInstance("AES", "SunJCE");

Wenn Sie einen anderen Anbieter wie Bouncy Castle verwenden, dann

Cipher cipher =  Cipher.getInstance("AES", "BC");

14

Sie können einen Sicherheitsanbieter hinzufügen, indem Sie java.security mit folgendem Code zum Erstellen eines statischen Blocks bearbeiten:

static {
    Security.addProvider(new BouncyCastleProvider());
}

Wenn Sie ein Maven-Projekt verwenden , müssen Sie die Abhängigkeit für BouncyCastleProvider wie folgt in der Datei pom.xml Ihres Projekts hinzufügen .

<dependency>
            <groupId>org.bouncycastle</groupId>
            <artifactId>bcprov-jdk15on</artifactId>
            <version>1.47</version>
</dependency>

Wenn Sie ein normales Java-Projekt verwenden , können Sie den Download bcprov-jdk15on-147.jar über den unten angegebenen Link hinzufügen und Ihren Klassenpfad bearbeiten.

http://www.java2s.com/Code/Jar/b/Downloadbcprovextjdk15on147jar.htm


1

Für diejenigen, die Webserver verwenden, stellen Sie sicher, dass die bcprov-jdk16-145.jar in Ihrer Server-Bibliothek installiert wurde, da Weblogic das JAR einfügen musste:

<weblogic_jdk_home>\jre\lib\ext

1

Meine Erfahrung damit war, dass es in Ordnung war, den Provider als Zeichenfolge wie diese zu verwenden, wenn ich dies bei jeder Ausführung hatte

Security.addProvider(new BounctCastleProvider());
new JcaPEMKeyConverter().setProvider("BC");

Aber als ich optimiert und folgendes in den Konstruktor eingefügt habe:

   if(bounctCastleProvider == null) {
      bounctCastleProvider = new BouncyCastleProvider();
    }

    if(Security.getProvider(bouncyCastleProvider.getName()) == null) {
      Security.addProvider(bouncyCastleProvider);
    }

Dann musste ich einen solchen Anbieter verwenden, sonst würde ich den obigen Fehler bekommen:

new JcaPEMKeyConverter().setProvider(bouncyCastleProvider);

Ich verwende bcpkix-jdk15on Version 1.65

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.