Как использовать Java SASL API и CRAM-MD5 - PullRequest
0 голосов
/ 16 января 2010

В настоящее время я играю с Java SASL API и написал небольшую программу для имитации последовательности ответов на вызовы с использованием CRAM-MD5. Тем не менее, я не уверен, как это сделать, поскольку SaslClient и SaslServer имеют только методыvaluChallenge (...) иvaluResponse (...). Я ожидаю, что SaslServer будет иметь метод, подобный IssueChallenge (...) или что-то подобное, но это не так. Итак, как правильно это сделать?

Ниже вы найдете мой (не работающий) код.

    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.");
  }
 }
}

Привет, Фред

1 Ответ

2 голосов
/ 31 марта 2010

Мне удалось заставить приведенный выше код работать, изменив одну строку

с

challenge = ss.evaluateResponse(null);

на

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

В Javadoc для valuResponse () говорится

этот метод вызывается для подготовки следующего следующего запроса для отправки клиенту

Так что, как я полагаю из вышесказанного, нет необходимости в методе issueChallange(),evaluateResponse() позаботится о выдаче ответа.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...