当前位置: 首页 > 知识库问答 >
问题:

如何在一个jar中实现bouncycastle?

颛孙钱青
2023-03-14

我正在一个项目中使用SSHJ库。SSHJ库使用bouncycastle加密

在eclipse中一切都很好,但是在我使用one-jar将所有内容打包到单个jar包中之后,我面临着bouncyCastle lib的问题。bcprov-jdk15on-1.51.jar包含在 /lib的JAR包中,所有其他库以及例如sshj.jar.

在日志上,我有这些:

未找到Security Provider类org.bouncycastle.jce.provider.BouncyCastleProvider

还有这个

警告:禁用高强度密码:密码强度显然受到JCE策略的限制

SFTP连接具有以下功能:

net.schmizz.sshj.transport.TransportException:无法达成和解:[evie-hellman-group1-sha1, evie-hellman-group-ex换-sha1]和[evie-hellman-group-ex换-sha256]

我所尝试的:

  • 将Java JCE安装到/lib/security中
    • 不知道为什么仍然会弹出关于禁用的高强度密码的上述消息

    这就是“按预期”工作的方式:

    • 将bcprov-jdk15on-1.51.jar放入JAVA_HOME\lib\ext\
      • 不幸的是,这是我的最后一个选择。我将非常头疼在Java版本更新情况下维护库。

      所以,很明显BC库有一些类路径问题?我在某个地方读到一些关于签名安全提供程序库有一个实现问题的东西,不太明白那个问题...也许这也是这里的原因?

      有没有办法解决这个问题?在此问题上的任何帮助都将不胜感激,谢谢!

      编辑:我的build.xml实现了建议的代码签名:

          <target name="package_x" depends="package_y">
          <!-- Create manifest file for x -->
          <delete file="MANIFEST.MF"/>
          <manifest file="MANIFEST.MF">
              <attribute name="Main-Class" value="com.simontuffs.onejar.Boot"/>
              <attribute name="One-Jar-Main-Class" value="com.some.main.class.name"/>
              <attribute name="Class-Path" value="some_other_libs lib/bcprov-jdk15on.jar ." />
          </manifest>
      
          <!-- Copy properties file -->
          <copy todir="${module.dist.dir}">
              <fileset dir="${module.x.build.dir}/classes">
                  <include name="**/*.properties"/>
              </fileset>
          </copy>
      
              <signjar destDir="${basedir}/distribute/lib/" 
                      alias="server" keystore="${module.x.src.dir}/keystore/myCSC.jks"
                      storepass="pass"
                      preservelastmodified="true">
                  <path>
                      <fileset dir="${basedir}/distribute/lib/" includes="bcprov-jdk15on.jar" />
                  </path>
                  <flattenmapper />
              </signjar>
      
          <!-- Construct the One-JAR file -->
          <echo message="Creating a ONE-jar package of the x files..." />
      
          <one-jar destfile="${module.dist.dir}/${module.x.package}" manifest="MANIFEST.MF">
              <main>
                  <fileset dir="${module.x.build.dir}/classes/">
                      <exclude name="x-config.properties"/>
                  </fileset>
              </main>
      
              <lib>               
                  <fileset dir="${basedir}/distribute/lib/" />
                  <fileset dir="${module.common.dist.dir}" />
      
              </lib>
          </one-jar>
      
              <signjar destDir="${module.dist.dir}" 
                      alias="server" keystore="${module.agent.src.dir}/keystore/myCSC.jks"
                      storepass="pass"
                      preservelastmodified="true">
                  <path>
                      <fileset dir="${module.dist.dir}" includes="**/*.jar" />
                  </path>
                  <flattenmapper />
              </signjar>
      
      </target>
      

共有2个答案

束俊英
2023-03-14

回答我自己的问题:

两种解决方案:

  • 将库添加到Java的lib/ext
  • 简单易用,似乎支持添加JCE提供者,如Bouncycastle
壤驷茂实
2023-03-14

要实现加密提供程序,需要对jar进行签名

如果您的提供商通过密码、密钥协议、密钥生成器、Mac或SecretKeyFactory类提供加密算法,则需要对JAR文件签名,以便JCA可以在运行时验证代码。

Bouncycastle罐子已签名。您已经将所有类重新打包到一个jar中,但您并没有说您已经签署了它,所以我猜您没有这样做<代码>SSHJ可能正在使用某些加密算法,无法初始化bouncycastle

选项:

>

  • 使用代码签名证书对代码进行签名

    部署bcprov-jdk15on-1.51.jar与您的应用程序

  •  类似资料:
    • 我有一个包裹 现在我想禁止在之外的实现,但是应该是公共的,因为我将其用于。 如何做到这一点? 这有什么“套餐最终模式”吗? 你有过这样的情况吗? 详情: 我知道有可能只使用带有包私有构造函数的抽象类,而不是接口,但是和扩展不同的类,因此我需要多重继承(因为模拟多重继承(例如,见有效的Java项目18)在这里不起作用)。

    • 然后在'main'类中,我将'panel'添加到JFrame中。 我的问题是,我正在尝试实现一个actionListener到一个添加在'Panel'类内部的按钮。actionListener函数将添加更多按钮并使用G.DrawString的按钮。现在,我要将ActionListener放置在哪里,以便这样做呢?如何将g.drawString用于特定的面板,而g.drawString行位于另一个类

    • 本文向大家介绍如何在 Java 中实现一个 redis 缓存服务,包括了如何在 Java 中实现一个 redis 缓存服务的使用技巧和注意事项,需要的朋友参考一下 缓存服务的意义 为什么要使用缓存?说到底是为了提高系统的运行速度。将用户频繁访问的内容存放在离用户最近,访问速度最快的地方,提高用户的响应速度。一个 web 应用的简单结构如下图。 web 应用典型架构 在这个结构中,用户的请求通过用户

    • 现在只有一个嘲笑工作正常。另一个返回空指针异常。@Autowired和@Mock都为BCryptPasswordEncoder密码编码器提供空点;

    • 我正在使用SBT(在IntelliJ IDEA中)构建一个简单的Scala项目。 我想知道什么是最简单的方法来建立一个Uber JAR文件(又名胖JAR,超级JAR)。 我当前使用的是SBT,但当我将JAR文件提交到Apache Spark时,我得到以下错误: 线程“main”java.lang.SecurityException中的异常:清单主属性的签名文件摘要无效 或在编译期间出现此错误: j

    • 配置文件配置包扫描路径 递归包扫描获取.class文件 反射,确定需要交给IOC管理的类 对需要注入的类进行依赖注入 配置文件中指定需要扫描的包路径 定义一些注解,分别表示访问控制层、业务逻辑层、数据持久层、依赖注入注解、获取配置文件注解 从配置文件中获取需要扫描的包路径,获取到当前路径下的文件信息及文件夹信息,我们将当前路径下所有以.class结尾的文件添加到一个Set集合中进行存储 遍历这个s