Arhn - архитектура программирования

java bouncy-castle KeyAgreement.getInstance работает в eclipse, но выдает исключение: JCE не может аутентифицировать поставщика BC, когда jared

привет, я пытался перевести некоторый код Spring в vertx, и у меня есть этот фрагмент кода, который использует надувной замок

    private SecretKey calculateSecureSymetricKey(Key privateKey, Key receivedPublicKey) throws Exception {
    
    BouncyCastleProvider bouncyCastleProvider = new BouncyCastleProvider();
    KeyAgreement keyAgreement ;
    
    try {
        keyAgreement = KeyAgreement.getInstance("ECDH", bouncyCastleProvider);
    
    } catch (Exception e) {
        System.out.println("failed in custom exception");
        System.out.println("==============================");
        e.printStackTrace();
        System.out.println("==============================");
        throw new Exception(e);
    }
    
    keyAgreement.init(privateKey);
    keyAgreement.doPhase(receivedPublicKey, true);
    byte[] sharedSecret = keyAgreement.generateSecret();
    ASN1ObjectIdentifier oid = NISTObjectIdentifiers.id_aes256_CBC;
    int keySize = 256;
    DHKDFParameters params = new DHKDFParameters(oid, keySize, sharedSecret, null);
    ECDHKEKGenerator kdf = new ECDHKEKGenerator(DigestFactory.createSHA256());
    kdf.init(params);
    byte[] keyBytes = new byte[keySize / 8];
    kdf.generateBytes(keyBytes, 0, keyBytes.length);
    SecretKeySpec aes = new SecretKeySpec(keyBytes, "AES");
    return aes;

}

теперь, когда я запускаю его в своей среде IDE (eclipse), он работает нормально, но когда я использую maven, чтобы превратить это в банку с этим pom.xml

        <dependency>
        <groupId>org.bouncycastle</groupId>
        <artifactId>bcpkix-jdk15on</artifactId>
        <version>1.62</version>
        <!-- <version>1.59</version> -->
    </dependency>
    <dependency>
        <groupId>org.bouncycastle</groupId>
        <artifactId>bcprov-jdk15on</artifactId>
        <!-- <version>1.59</version> -->
        <version>1.62</version>
    </dependency>


    <!-- some more pom here that I can post if you think it's relevant -->


    <build>
    <plugins>
        <plugin>
            <artifactId>maven-assembly-plugin</artifactId>
            <configuration>
                <archive>
                    <manifest>
                        <mainClass>mytest.Main</mainClass>
                    </manifest>
                </archive>
                <!-- <appendAssemblyId>false</appendAssemblyId> -->
                <descriptorRefs>
                    <descriptorRef>jar-with-dependencies</descriptorRef>
                </descriptorRefs>
            </configuration>
            <executions>
                <execution>
                    <id>make-assembly</id> <!-- this is used for inheritance merges -->
                    <phase>package</phase> <!-- bind to the packaging phase -->
                    <goals>
                        <goal>single</goal>
                    </goals>
                </execution>
            </executions>
        </plugin>
    </plugins>
</build>

Я запускаю mvn clean install и пытаюсь запустить банку, я получаю это исключение

java.lang.SecurityException: JCE cannot authenticate the provider BC
        at java.base/javax.crypto.JceSecurity.getInstance(JceSecurity.java:143)
        at java.base/javax.crypto.KeyAgreement.getInstance(KeyAgreement.java:278)
        at deanew.service.KeyExchangeService.calculateSecureSymetricKey(KeyExchangeService.java:93)
        at deanew.service.KeyExchangeService.generateSecretKeyFromResponse(KeyExchangeService.java:84)
        at deanew.service.DeaNewService.getSaredSecretKey(DeaNewService.java:82)
        at deanew.service.DeaNewService.getPersonInfo(DeaNewService.java:177)
        at deanew.service.DeaNewService.getOldPersonInfo(DeaNewService.java:94)
        at deanew.service.DeaServiceImpl.lambda$deaByPin$0(DeaServiceImpl.java:54)
        at io.vertx.core.impl.ContextImpl.lambda$executeBlocking$2(ContextImpl.java:316)
        at io.vertx.core.impl.TaskQueue.run(TaskQueue.java:76)
        at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1135)
        at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:635)
        at io.netty.util.concurrent.FastThreadLocalRunnable.run(FastThreadLocalRunnable.java:30)
        at java.base/java.lang.Thread.run(Thread.java:844)
Caused by: java.util.jar.JarException: file:/C:/Users/97252/eclipse-workspace_zukit_se/mytest/target/myTest-0.0.1
-SNAPSHOT-jar-with-dependencies.jar has unsigned entries - dea/dea.jks
        at java.base/javax.crypto.JarVerifier.verifySingleJar(JarVerifier.java:459)
        at java.base/javax.crypto.JarVerifier.verifyJars(JarVerifier.java:314)
        at java.base/javax.crypto.JarVerifier.verify(JarVerifier.java:257)
        at java.base/javax.crypto.ProviderVerifier.verify(ProviderVerifier.java:129)
        at java.base/javax.crypto.JceSecurity.verifyProvider(JceSecurity.java:189)
        at java.base/javax.crypto.JceSecurity.getVerificationResult(JceSecurity.java:215)
        at java.base/javax.crypto.JceSecurity.getInstance(JceSecurity.java:139)
        ... 13 more

так что мои вопросы

  1. кто-нибудь знает, в чем проблема с этим кодом? или если это
  2. это пример кода, просто чтобы изолировать проблему и посмотреть, смогу ли я скомпилировать банку и передать ее в качестве дополнения к основному проекту, но pom.xml, который я использую в основном приложении, использует maven-shade-plugin вместо maven-assembly-plugin, который я использую в этом примере это будет работать даже с vertx? быть

Я думаю, что ясно объяснил, но если я этого не сделал, пожалуйста, скажите мне спасибо заранее

РЕДАКТИРОВАТЬ:

до сих пор я также пытался загрузить банки и добавить их в качестве зависимости с такой системой областей видимости.

        <dependency>
        <groupId>org.bouncycastle</groupId>
        <artifactId>bcpkix-jdk15on</artifactId>
        <scope> system</scope>
        <systemPath>${basedir}/src/lib/bcpkix-jdk15on-1.63.jar</systemPath>
        <version>1.63</version>
    </dependency>
    <dependency>
        <groupId>org.bouncycastle</groupId>
        <artifactId>bcprov-jdk15on</artifactId>
        <scope> system</scope>
        <systemPath>${basedir}/src/lib/bcprov-jdk15to18-1.63.jar</systemPath>
        <version>1.63</version>
    </dependency>
    <dependency>
        <groupId>io.vertx</groupId>
        <artifactId>vertx-core</artifactId>
        <version>${vertx.version}</version>
    </dependency>

и я попытался добавить sulotion Майкла Фера, так что теперь сборка выглядит так

    <build>

    <plugins>
        <plugin>
            <artifactId>maven-assembly-plugin</artifactId>
            <configuration>
            <target name="-post-jar">
                    <jar jarfile="">
                        <zipfileset src="${dist.jar}" excludes="META-INF/*" />
                        <zipfileset src="/src/lib/bcpkix-jdk15on-1.63.jar"
                            excludes="META-INF/*" />

                        <zipfileset src="/src/lib/bcprov-jdk15to18-1.63.jar"
                            excludes="META-INF/*" />

                    </jar>
                </target>
                <archive>
                    <addMavenDescriptor>false</addMavenDescriptor>
                    <manifest>
                        <mainClass>mytest.Main</mainClass>
                    </manifest>
                </archive>
                <appendAssemblyId>false</appendAssemblyId>
                <descriptorRefs>
                    <descriptorRef>jar-with-dependencies</descriptorRef>
                </descriptorRefs>
            </configuration>
            <executions>
                <execution>
                    <id>make-assembly</id> <!-- this is used for inheritance merges -->
                    <phase>package</phase> <!-- bind to the packaging phase -->
                    <goals>
                        <goal>single</goal>
                    </goals>
                </execution>
            </executions>
        </plugin>
    </plugins>
</build>

и до сих пор те же проблемы любые мысли

и спасибо заранее


Ответы:


1

Вы используете Bouncy Castle (BC) в качестве криптопровайдера в своей программе. Банки BC имеют цифровую подпись для предотвращения любых нежелательных изменений. При запуске программы в вашей среде IDE банки загружаются из пути к классам, и все работает.

Теперь вы создаете новую банку со своими программными классами, включая BC-классы. Ваш скрипт maven разархивирует BC-jar (если вы не знаете - просто переименуйте .jar в .zip и откройте его, вы увидите содержимое BC jar), объединит все классы и сгенерирует один jar.

Пока все хорошо, но если заглянуть в банку BC (здесь bcprov-jdk15to18-165.jar) и папку META-INF, там есть несколько файлов с окончанием DSA и RSA). Для чего нужны эти файлы? У них есть цифровые подписи, чтобы доказать, что банка не изменилась.

Проблема в том, что подписи не соответствуют новому контенту, в котором они включают другие классы от вас и другие сторонние библиотеки.

Одним из решений является предоставление внешних библиотек отдельно от вашего программного приложения.

Еще одно решение - исключить распаковку этих банок. Здесь на SO есть несколько вопросов и ответов, одним из возможных решений (не проверенных мной) является этот скрипт для maven: (взято из https://stackoverflow.com/a/44345254/8166854):

 <target name="-post-jar">
    <jar jarfile="dist/PKIFrapper.jar" >
    <zipfileset src="${dist.jar}" excludes="META-INF/*" />
    <zipfileset src="src/lib/bcmail-jdk15on-155.jar" excludes="META-INF/*" />
    <zipfileset src="src/lib/bcpg-jdk15on-155.jar" excludes="META-INF/*" />
    <zipfileset src="src/lib/bcpkix-jdk15on-155.jar" excludes="META-INF/*" />
    <zipfileset src="src/lib/bcprov-ext-jdk15on-155.jar" excludes="META-INF/*" />
    <zipfileset src="src/lib/bcprov-jdk15on-155.jar" excludes="META-INF/*" />
    <zipfileset src="src/lib/bctest-jdk15on-155.jar" excludes="META-INF/*" />
    <zipfileset src="src/lib/commons-codec-1.10-javadoc.jar" excludes="META-INF/*" />
    <zipfileset src="src/lib/commons-codec-1.10-sources.jar" excludes="META-INF/*" />
    <zipfileset src="src/lib/commons-codec-1.10.jar" excludes="META-INF/*" />
    <zipfileset src="src/lib/log4j-1.2-api-2.3-javadoc.jar" excludes="META-INF/*" />
    <zipfileset src="src/lib/log4j-1.2-api-2.3-sources.jar" excludes="META-INF/*" />
    <zipfileset src="src/lib/log4j-1.2-api-2.3.jar" excludes="META-INF/*" />

    <manifest>

        <attribute name="Main-Class" value="MyLibrary.*"/>
    </manifest>
    </jar>
</target>

Но будьте осторожны: подписи могут повлиять на некоторые функции шифрования, поскольку они могут не работать или работать не так, как ожидалось.

16.07.2020
  • эй, я попробовал это сейчас, и это тоже, похоже, не работает. Я изменил соответствующий путь банки надувного замка на свое местоположение, и у него все еще есть та же проблема, единственное, что я не изменил, это ‹jar jarfile=dist/ PKIFrapper.jar › и строки ‹zipfileset src=${dist.jar} exclude=META-INF/* /› есть идеи, в чем проблема? 19.07.2020

  • 2

    Обратитесь к Похожая проблема и официальные примечания.

    а. Попробуйте с JDK 8

    б. Используйте «bcprov-jdk15to18», версия: «1.63» — https://mvnrepository.com/artifact/org.bouncycastle/bcprov-jdk15to18

    16.07.2020
    Новые материалы

    Коллекции публикаций по глубокому обучению
    Последние пару месяцев я создавал коллекции последних академических публикаций по различным подполям глубокого обучения в моем блоге https://amundtveit.com - эта публикация дает обзор 25..

    Представляем: Pepita
    Фреймворк JavaScript с открытым исходным кодом Я знаю, что недостатка в фреймворках JavaScript нет. Но я просто не мог остановиться. Я хотел написать что-то сам, со своими собственными..

    Советы по коду Laravel #2
    1-) Найти // You can specify the columns you need // in when you use the find method on a model User::find(‘id’, [‘email’,’name’]); // You can increment or decrement // a field in..

    Работа с временными рядами спутниковых изображений, часть 3 (аналитика данных)
    Анализ временных рядов спутниковых изображений для данных наблюдений за большой Землей (arXiv) Автор: Рольф Симоэс , Жильберто Камара , Жильберто Кейрос , Фелипе Соуза , Педро Р. Андраде ,..

    3 способа решить квадратное уравнение (3-й мой любимый) -
    1. Методом факторизации — 2. Используя квадратичную формулу — 3. Заполнив квадрат — Давайте поймем это, решив это простое уравнение: Мы пытаемся сделать LHS,..

    Создание VR-миров с A-Frame
    Виртуальная реальность (и дополненная реальность) стали главными модными терминами в образовательных технологиях. С недорогими VR-гарнитурами, такими как Google Cardboard , и использованием..

    Демистификация рекурсии
    КОДЕКС Демистификация рекурсии Упрощенная концепция ошеломляющей О чем весь этот шум? Рекурсия, кажется, единственная тема, от которой у каждого начинающего студента-информатика..