2010-01-16 8 views
0

현재 Java SASL API를 사용하고 CRAM-MD5를 사용하여 챌린지 응답 시퀀스를 시뮬레이트하는 약간의 프로그램을 작성했습니다. 그러나 SaslClient 및 SaslServer 메서드를 evaluateChallenge (...) 및 evaluateResponse (...) 경우에만이 작업을 수행하는 방법에 대해 확실하지 않습니다. 나는 SaslServer가 issueChallenge (...) 같은 것을 가지길 기대하지만, 그렇지 않습니다. 그렇다면이 작업을 수행하는 올바른 방법은 무엇입니까?Java SASL API 및 CRAM-MD5 사용 방법

다음은 내 (작동하지 않는) 코드입니다.

package mypackage; 

    import java.io.IOException; 

    import javax.security.auth.callback.Callback; 
    import javax.security.auth.callback.CallbackHandler; 
    import javax.security.auth.callback.NameCallback; 
    import javax.security.auth.callback.PasswordCallback; 
    import javax.security.auth.callback.UnsupportedCallbackException; 
    import javax.security.sasl.AuthorizeCallback; 
    import javax.security.sasl.Sasl; 
    import javax.security.sasl.SaslClient; 
    import javax.security.sasl.SaslException; 
    import javax.security.sasl.SaslServer; 

    public class Main { 

    public static void main(String[] args) throws SaslException { 

    new Main().start(); 
} 

private static class ClientHandler implements CallbackHandler { 

    @Override 
    public void handle(Callback[] cbs) throws IOException, UnsupportedCallbackException { 
    for (Callback cb : cbs) { 
    if (cb instanceof NameCallback) { 

    System.out.println("Client - NameCallback"); 

    NameCallback nc = (NameCallback)cb; 
    nc.setName("username"); 
    } else if (cb instanceof PasswordCallback) { 

    System.out.println("Client - PasswordCallback"); 

    PasswordCallback pc = (PasswordCallback)cb; 
    pc.setPassword("password".toCharArray()); 
    } 
    } 
    } 
} 

private static class ServerHandler implements CallbackHandler { 

    @Override 
    public void handle(Callback[] cbs) throws IOException, UnsupportedCallbackException { 
    for (Callback cb : cbs) { 
    if (cb instanceof AuthorizeCallback) { 

    System.out.println("Server - AuthorizeCallback"); 

    AuthorizeCallback ac = (AuthorizeCallback)cb; 
    ac.setAuthorized(true); 

    } else if (cb instanceof NameCallback) { 

    System.out.println("Server - NameCallback"); 

    NameCallback nc = (NameCallback)cb; 
    nc.setName("username"); 

    } else if (cb instanceof PasswordCallback) { 

    System.out.println("Server - PasswordCallback"); 

    PasswordCallback pc = (PasswordCallback)cb; 
    pc.setPassword("password".toCharArray()); 
    } 
    } 
    } 
} 

private void start() throws SaslException { 

    byte[] challenge; 
    byte[] response; 

    ClientHandler clientHandler = new ClientHandler(); 
    ServerHandler serverHandler = new ServerHandler(); 

    SaslClient sc = Sasl.createSaslClient(new String[] { "CRAM-MD5" }, null, "my_server", "FQHN", null, clientHandler); 
    SaslServer ss = Sasl.createSaslServer("CRAM-MD5", "my_server", "FQHN", null, serverHandler); 

    // Challenge response sequence (not working) 
    challenge = ss.evaluateResponse(null); 
    response = sc.evaluateChallenge(challenge); 
    ss.evaluateResponse(response); 

    if (ss.isComplete()) { 
    System.out.println("Authentication successful."); 
    } 
} 
} 

인사말, 프레드

답변

2

나는

challenge = ss.evaluateResponse(null); 

challenge = ss.evaluateResponse(new byte[0]); 

javadoc의를위한에서 한 줄

을 변경하여 작업 위의 코드를 얻을 수 있었다 평가하다 eResponse는()하는 issueChallange() 방법에 대한 필요, evaluateResponse()는 돌봐이없는이 방법은

그래서 나는 위에서 추측 클라이언트에 제출 적절한 다음 도전을 준비하기 위해 호출됩니다

말한다 응답을 발행하는 것.