2015-08-28 145 views
0

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

这里是产生所描述的错误项目的一个非常简单的例子:

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> 

回答

3

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

请尝试将org.bouncycastle模块导入您的应用程序,并确保您的WAR中不包含BouncyCastle库的副本,例如,在您的POM中使用provided作用域用于BouncyCastle依赖关系。

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

+0

项目正在建设中,但我仍然在部署中遇到同样的错误。我使用的这个相关性:' \t \t \t org.bouncycastle \t \t \t bcprov-jdk16 \t \t \t 1.46 \t \t \t 提供 \t \t' – Benny