【问题标题】:BouncyCastle ClassNotFoundException on deployment to WildFly部署到 WildFly 时出现 BouncyCastle ClassNotFoundException
【发布时间】:2015-08-28 10:45:55
【问题描述】:

我想使用 BouncyCastle API (v 1.52) 在 WildFly 服务器上的 Web 应用程序中使用 PBKDF2WithHmacSHA1 算法对密码进行哈希处理。但是,当我部署我的应用程序时,我总是从服务器获得“ClassNotFoundException org.bouncycastle.crypto.PBEParametersGenerator”。我正在使用 Eclipse Mars 和 WildFly 8.2.0 和 9.0.1。我在 Eclipse 中的项目中没有任何错误。我已经尝试将 BouncyCastle JAR 添加到我的类路径中,如此处另一个主题中所述,但它没有帮助。我想知道为什么我在这里或谷歌上找不到关于这个问题的任何其他结果,有人可以帮助我吗?我知道 Java 8 有一个 PBKDF2WithHmacSHA256 实现,但我还是想使用 BouncyCastle API 作为替代方案。

这是一个产生上述错误的非常简单的项目示例:

BouncyCastleHasher.java:

import java.util.Arrays;
import java.util.Base64;

import javax.faces.bean.ManagedBean;
import org.bouncycastle.crypto.PBEParametersGenerator;
import org.bouncycastle.crypto.generators.PKCS5S2ParametersGenerator;
import org.bouncycastle.crypto.params.KeyParameter;

@ManagedBean
public class BouncyCastleHasher {
    private String input;
    private String output;

    public String hash() {
        if(input!=null) {
            byte[] salt = "12345678".getBytes();
            PBEParametersGenerator generator = new PKCS5S2ParametersGenerator();
            generator.init(PBEParametersGenerator.PKCS5PasswordToUTF8Bytes(input.toCharArray()), salt, 1);
            KeyParameter params = (KeyParameter)generator.generateDerivedParameters(128);
            byte[] hash = Arrays.toString(params.getKey()).getBytes();
            String encodedText = Base64.getEncoder().encodeToString(hash);
            setOutput(encodedText);
        }
        return "out";
    }

    public String getInput() {
        return input;
    }

    public void setInput(String input) {
        this.input = input;
    }

    public String getOutput() {
        return output;
    }

    public void setOutput(String output) {
        this.output = output;
    }
}

web.xml:

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" id="WebApp_ID" version="3.1">
  <display-name>Test_BouncyCastle</display-name>
  <welcome-file-list>
    <welcome-file>in.xhtml</welcome-file>
  </welcome-file-list>
</web-app>

in.xhtml:

<!DOCTYPE html>
<html lang="en" xmlns="http://www.w3.org/1999/xhtml"
    xmlns:f="http://xmlns.jcp.org/jsf/core"
    xmlns:ui="http://xmlns.jcp.org/jsf/facelets"
    xmlns:a="http://xmlns.jcp.org/jsf/passthrough"
    xmlns:h="http://xmlns.jcp.org/jsf/html">
<h:head>
    <title>Hashing site</title>
</h:head>
<h:body>
    <h:form>
        <table>
            <tr>
                <td>
                    <h:outputText value="Text to hash:" />
                </td>
                <td>
                    <h:inputText value="#{bouncyCastleHasher.input}" ></h:inputText>
                </td>
            </tr>
            <tr>
                <td>
                    <h:commandButton value="Save"
                        action="#{bouncyCastleHasher.hash}"></h:commandButton>
                </td>
            </tr>
        </table>
    </h:form>
</h:body>
</html>

out.xhtml:

<!DOCTYPE html>
<html lang="en" xmlns="http://www.w3.org/1999/xhtml"
    xmlns:f="http://xmlns.jcp.org/jsf/core"
    xmlns:ui="http://xmlns.jcp.org/jsf/facelets"
    xmlns:a="http://xmlns.jcp.org/jsf/passthrough"
    xmlns:h="http://xmlns.jcp.org/jsf/html">
<h:head>
    <title>Result</title>
</h:head>
<h:body>
    <h:form>
        <table>
            <tr>
                <td>
                    <h:outputText value="hashed text:" />
                </td>
                <td>
                    <h:outputText value="#{bouncyCastleHasher.output}"></h:outputText>
                </td>
            </tr>
        </table>
    </h:form>
    <h:link outcome="in"/>
</h:body>
</html>

【问题讨论】:

    标签: java eclipse wildfly bouncycastle classnotfoundexception


    【解决方案1】:

    BouncyCastle 库作为 JBoss 模块包含在 WildFly 发行版中。

    请尝试将 org.bouncycastle 模块导入您的应用程序,并确保您的 WAR 中不包含 BouncyCastle 库的副本,例如通过在 POM 中对 BouncyCastle 依赖项使用 provided 范围。

    有关导入模块的更多详细信息,请参阅Classloading in WildFly

    【讨论】:

    • 项目正在构建,但我在部署时仍然遇到同样的错误。我正在使用这个依赖:&lt;dependency&gt; &lt;groupId&gt;org.bouncycastle&lt;/groupId&gt; &lt;artifactId&gt;bcprov-jdk16&lt;/artifactId&gt; &lt;version&gt;1.46&lt;/version&gt; &lt;scope&gt;provided&lt;/scope&gt; &lt;/dependency&gt;
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-18
    相关资源
    最近更新 更多