gpt4 book ai didi

java - 如何使用 Java SASL API 和 CRAM-MD5

转载 作者:行者123 更新时间:2023-12-02 08:35:11 24 4
gpt4 key购买 nike

我目前正在使用 Java SASL API,并编写了一个小程序来使用 CRAM-MD5 模拟质询响应序列。但是,我不确定如何执行此操作,因为 SaslClient 和 SaslServer 仅具有方法valuateChallenge(...) 和evaluateResponse(...)。我希望 SaslServer 有一个像 issuesChallenge(...) 或类似的方法,但它没有。那么正确的方法是什么?

在下面您可以找到我的(不起作用)代码。

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

你好,弗雷德

最佳答案

我可以通过更改一行来使上述代码正常工作

来自

challenge = ss.evaluateResponse(null);

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

evaluateResponse() 的 javadoc 说

this method is called to prepare an appropriate next challenge to submit to the client

所以我从上面猜测,不需要 issueChallange() 方法,evaluateResponse() 负责发出响应。

关于java - 如何使用 Java SASL API 和 CRAM-MD5,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2077768/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com