2013-07-12 8 views
1

DH 키 교환 응용 프로그램으로 거의 끝났습니다. 내 응용 프로그램에서 내 클라이언트를 인증하려고합니다. 그러나 내 서버에서 널 포인터 예외가 계속 발생합니다. 문제를 큰 정수 변수로 추적했지만 문제는 없습니다.서블릿에서 Null 포인터 예외가 발생했습니다.

1 또는 0의 응답을 클라이언트에 보내려고합니다. 1 인증 나타내고 0은 오류가

public class DHServlet extends HttpServlet { 
private static final long serialVersionUID = 1L; 
private static String pk2; 
private static String pCValue; 
private static String gCValue; 
private static String sCValue; 
protected void processRequest(HttpServletRequest request, HttpServletResponse response) 
     throws ServletException, IOException { 
    response.setContentType("text/html;charset=UTF-8"); 
    PrintWriter out = response.getWriter(); 
    // PrintWriter out2=response.getWriter(); 
    DH getDH = new DH(); 



    try { 
    String un,pw,pk; 

    Random randomGenerator = new Random(); 

    long pValue = randomGenerator.nextInt(100000000); 
    long gValue = randomGenerator.nextInt(100000000); 

    boolean checkPrime = getDH.isPrime(pValue); 

    while(checkPrime == false) 
    { 
     long generatePValue2 = randomGenerator.nextInt(10000000); 
     boolean checkPrime2 = getDH.isPrime(generatePValue2); 
     if(checkPrime2==true) 
     { 
      pValue=generatePValue2; 
      break; 
     } 
    } 

    long checkSP = (pValue*2)+1; 
    boolean checkSafePrime = getDH.isPrime(checkSP); 

    while(checkSafePrime == false) 
    { 
     long generatePValue3 = randomGenerator.nextInt(100000000); 
     boolean checkSpInLoop = getDH.isPrime(generatePValue3); 
     long checkSP2 = (generatePValue3*2)+1; 
     boolean checkSafePrimeInLoop = getDH.isPrime(checkSP2); 

     if(checkSpInLoop == true && checkSafePrimeInLoop == true) 
     { 
      pValue = generatePValue3; 
      break; 
     } 
    } 

    while(gValue>pValue) 
    { 
     long gValue2=randomGenerator.nextInt(100000000); 
     if(gValue2<pValue) 
     { 
      gValue=gValue2; 
      break; 
     } 
    } 

    long getDivisor =(pValue-1)/2; 
    BigInteger bi1,bi2,bi3,bi4; 

    bi1=BigInteger.valueOf(getDivisor); 
    bi2=BigInteger.valueOf(pValue); 
    bi3=BigInteger.valueOf(gValue); 
    bi4=bi3.modPow(bi1,bi2); 

    long calculatedValue = bi4.longValue(); 

    while(calculatedValue == 1) 
    { 
     long gValue3=randomGenerator.nextInt(100000000); 
     long getDivisorInLoop = (pValue-1)/2; 
     BigInteger bi5,bi6,bi7,bi8; 

     bi5=BigInteger.valueOf(getDivisorInLoop); 
     bi6=BigInteger.valueOf(pValue); 
     bi7=BigInteger.valueOf(gValue3); 
     bi8=bi7.modPow(bi5, bi6); 

     long calculatedValueInLoop = bi8.longValue(); 

     if(calculatedValueInLoop != 1) 
     { 
      gValue=gValue3; 
      break; 
     } 

    } 

    BigInteger generatorValue,primeValue,skA,biPKA; 
    generatorValue = BigInteger.valueOf(gValue); 
    primeValue = BigInteger.valueOf(pValue); 
    long secretKeyA = getDH.generateSKA(); 
    skA=BigInteger.valueOf(secretKeyA); 
    biPKA =getDH.generatePkA(generatorValue, primeValue, secretKeyA); 
    System.out.println("The public key of server is "+biPKA); 
    System.out.println("The generator value is "+generatorValue); 
    System.out.println("The prime value is "+primeValue); 
    System.out.println("the secret key of the server is "+skA); 

    long PKA = biPKA.longValue(); 

    out.print(pValue+":"+gValue+":"+PKA); 


    pk2=biPKA.toString(); 
    pCValue=primeValue.toString(); 
    gCValue=generatorValue.toString(); 
    sCValue=skA.toString(); 




    } finally {    
     out.close(); 
    } 
} 



protected void processRequest2(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException 
{ 
    response.setContentType("text/html;charset=UTF-8"); 
    PrintWriter out = response.getWriter(); 
    DH getDH2=new DH(); 
    String un,pw,pk,shareK; 

    try 
    { 
     pk=request.getParameter("publicK"); 
     un=request.getParameter("username"); 
     pw=request.getParameter("password"); 
     shareK=request.getParameter("sharedKey"); 

     String publicKey = pk; 

     BigInteger biPK,biSK,biP,sKey; 
     biPK = new BigInteger(publicKey); 
     biSK = new BigInteger(sCValue); 
     biP = new BigInteger(pCValue); 

     System.out.println(biPK); 
     sKey = getDH2.calculateSharedKey(biPK, biSK, biP); 
     String sharedServerKey = (sKey.toString()).trim(); 
     System.out.println("the shared key is "+sharedServerKey); 
     if(un.equalsIgnoreCase("larry")&& pw.equals("123") && sharedServerKey == shareK) 
     { 
      out.print(1); 

     } 
     else 
     { 
      out.print(0); 
     } 

    }finally 
    { 
     out.close(); 
    } 



} 




/** 
* @see HttpServlet#HttpServlet() 
*/ 
public DHServlet() { 
    super(); 
    // TODO Auto-generated constructor stub 
} 

/** 
* @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response) 
*/ 
@Override 
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 
    processRequest(request,response); 
    processRequest2(request,response); 
} 

/** 
* @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response) 
*/ 
@Override 
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 
    processRequest2(request,response); 
} 

DHServlet.java

}

발생 어디 부분을 표시합니다

를 인증되지

내 톰캣 로그 :

Jul 12, 2013 10:10:07 PM org.apache.catalina.core.StandardWrapperValve invoke 
SEVERE: Servlet.service() for servlet [DHServlet] in context with path [/MyServletProject] threw exception 
java.lang.NullPointerException 
    at java.math.BigInteger.<init>(Unknown Source) 
    at java.math.BigInteger.<init>(Unknown Source) 
    at DHServlet.processRequest2(DHServlet.java:158) 
    at DHServlet.doGet(DHServlet.java:202) 
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:621) 
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:722) 
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:304) 
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210) 
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:240) 
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:164) 
    at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:462) 
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:164) 
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:100) 
    at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:562) 
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118) 
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:395) 
    at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:250) 
    at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:188) 
    at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:302) 
    at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source) 
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source) 
    at java.lang.Thread.run(Unknown Source) 

당신이 이걸로 나를 도울 수 있기를 바랍니다. 난처한 상황. 미리 감사드립니다.

편집 : 내 서블릿 코드를 업데이트했습니다. 당신이 얻고있는

pk=request.getParameter("publicK"); 
    un=request.getParameter("username"); 
    pw=request.getParameter("password"); 
    shareK=request.getParameter("sharedKey"); 

    BigInteger biPK,biSK,biP,sKey; 
    biPK = new BigInteger(pk); 
    biSK = new BigInteger(sCValue); 
    biP = new BigInteger(pCValue); 

:

답변

1

귀하의 스택 트레이스는

2

예외는 분명하다 (, 취소 또는 PW가 null PK 중 하나) 당신의 BigInteger를 중 하나에 문제가 발생하는 것을 말한다 어떤 변수 (pk, sCValue, pCValue)가 null이기 때문에 NullPointerException이됩니다.

그런데 변수 sCValuepCValue은 어디에서 초기화 되나요?

+0

메인 클래스의 전역 변수입니다. 상단의 코드 부분을 편집합니다 – Clearner88

+0

그런 다음'pk'가 null이 아니 었는지 확인하고 각 변수를 한 줄씩 디버깅하십시오. –

0

이 경우 null 값을 BigInteger 생성자에 전달하므로 NullPointerException이 발생합니다.

stacktrace는 전화를 걸었던 회선 번호 (DHServlet.java:158)를 알려줍니다. 광고 가정

다음 pk가 null 다음

biPK = new BigInteger(pk); 

이다.

+0

그것은 그 라인입니다, 그러나 변수가 null인지 어떻게 알 수 있습니까? 나는 변수를 출력했고 그것은 값을 포함하고 있었다. – Clearner88

0

아마도 null 문자열을 사용하여 BigInteger을 인스턴스화 할 수 있습니다. 모든 요청 매개 변수는 null입니다. 이러한 변수의

pk=request.getParameter("publicK"); 
un=request.getParameter("username"); 
pw=request.getParameter("password"); 
0

하나 : 내가이 Servlet에서 이 줄 알고하지 않기 때문에 pk, sCValue or pCValuenull입니까?

BigInteger을 인수로 인스턴스화 할 수 없습니다.

+0

만약 내가 틀렸어. doGet 메서드에서 processRequest2를 주석 처리하는 시험을했다. 코드는 제대로 작동하지만 주석 처리가 제거되면 널 포인터 예외가 발생합니다. 그것 때문일까? – Clearner88

+0

@ Clearner88 예 스택 추적을 살펴보면 문제가'DHServlet'의 158 행에 있기 때문에 볼 수 있습니다. 이 선은 무엇입니까? – mabbas

+0

흠 매우 이상합니다. isEmpty 메서드를 사용하여 모든 값을 검사했습니다. 그들 모두는 false를 반환했습니다 – Clearner88

관련 문제