JAVA: алгоритм генерации паролей, приводящий к неверному результату - PullRequest
0 голосов
/ 25 февраля 2019

У меня есть требование для вызова веб-службы SOAP 4.0 (на основе руководства по веб-службам https://kupdf.net/download/soap-4-0-amadeus-wbs-implementation-guide_58c657a8dc0d605613339031_pdf), которая требует аутентификации заголовка безопасности.К сожалению, в моем коде JAVA я в настоящее время застрял в шаге параметра пароля - что дает мне исключение под названием

2019-02-25 19:06:36 ОШИБКА ExceptionHandler: 36 - Отладка клиента: 11 |сессия |org.apache.cxf.binding.soap.SoapFault: 11 | Session |в org.apache.cxf.binding.soap.interceptor.Soap11FaultInInterceptor.unmarshalFault (Soap11FaultInInterceptor.java:86) в org.apache.cxf.binding.soap.interceptor.Soap11FaultInInterceptor.handleMessorj_setap.cxf.binding.(AbstractFaultChainInitiatorObserver.java:112) в org.apache.cxf.binding.soap.interceptor.CheckFaultInterceptor.handleMessage (CheckFaultInterceptor.java:69) в org.apache.cxf.binding.soap.interceptor.Inage.jor: 34) в org.apache.cxf.phase.PhaseInterceptorChain.doIntercept (PhaseInterceptorChain.java:308) в org.apache.cxf.endpoint.ClientImpl.onMessage (ClientImpl.java:798) в org.apache.cf.http.HTTPConduit $ WrappedOutputStream.HTTPConduit.java:1330) в java.util.zip.DeflaterOutputStream.close (DeflaterOutputStream.java:241) в org.apache.cxf.io.AbstractWrappedOutputStream.close (AbstractWrappedOutputStream.java:77) в org.ap,org.apache.cxf.transport.AbstractConduit.close (AbstractConduit.java:56) в org.apache.cxf.transport.http.HTTPConduit.close (HTTPConduit.java:652) в org.apache.cxf.interceptor.MessageSenderInceptMessageSenderEndingInterceptor.handleMessage (MessageSenderInterceptor.java:62) в org.apache.cxf.phase.PhaseInterceptorChain.doIntercept (PhaseInterceptorChain.java:308) по адресу org.apache.cxf.endpoint.ClientImpl.doInvoke (ClientImpl.java:514) по адресу org.apache.cxf.endpoint.ClientImpl.invoke (ClientImp23lg) или.apache.cxf.endpoint.ClientImpl.invoke (ClientImpl.java:324) в org.apache.cxf.endpoint.ClientImpl.invoke (ClientImpl.java:277) в org.apache.cxf.endpoint.ClientImpl.lv (:на119) на com.sun.proxy. $ Proxy48.invoke (неизвестный источник) на com.dlh.zambas.mw.client.ServiceProxy.callService (ServiceProxy.java:230) на com.dlh.zambas.mw.client.ServiceProxy.invoke (ServiceProxy.java:114)

ОШИБКА ExceptionHandler: 39 - Отладка клиента: null

Для параметра пароля требуется алгоритм генерации дайджеста пароля в формате:

Base64(SHA1($NONCE + $TIMESTAMP + SHA1($CLEARPASSWORD)))

Где: Base64 - схема кодирования двоичного текста;SHA1 - криптографическая хеш-функция;+ - функция конкатенации;$NONCE - входной параметр, сгенерированный клиентским приложением;$TIMESTAMP - входной параметр, который представляет текущую временную метку;$CLEARPASSWORD является параметром ввода - необработанный пароль.

Ниже приведен фрагмент кода, который я пытаюсь:

private String buildPasswordDigest(String nonce, String timestamp, String pass) {
        nonce=generateNonce();
        timestamp=generateTimestamp();
        pass="Test"
        try
        {
            MessageDigest msdDigest = MessageDigest.getInstance("SHA-1");
            msdDigest.update(pass.getBytes("UTF-8"), 0, pass.length());
            sha1_pass = byteToHex(msdDigest.digest());

            msdDigest.reset();

            String input_sha1= nonce+timestamp+sha1_pass;
            msdDigest.update(input_sha1.getBytes("UTF-8"), 0, input_sha1.length());
            return Base64.encodeBase64String(msdDigest.digest());

        }
        catch (NoSuchAlgorithmException e)
        {
            e.printStackTrace();
        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
        }

        return passwordDigest;
    }

private static String byteToHex(final byte[] hash){
    Formatter formatter = new Formatter();
    for (byte b : hash)
    {
        formatter.format("%02x", b);
    }
    String result = formatter.toString();
    formatter.close();
    return result;
}

private String generateNonce() {
    String dateTimeString = Long.toString(new Date().getTime());
    byte[] nonceByte = dateTimeString.getBytes();

    return Base64.encodeBase64String(nonceByte);
}

private String generateTimestamp() {
DateFormat dateFormatter = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'");
dateFormatter.setTimeZone(TimeZone.getTimeZone("UTC"));
Date today = Calendar.getInstance().getTime();
return dateFormatter.format(today);
}

Не соответствует ли он какому-либо формату?

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