JAVA:密码摘要生成算法导致错误的结果

时间:2019-02-25 18:04:41

标签: java web-services soap

我需要调用需要安全标头认证的SOAP 4.0 Web服务(基于Web服务指南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 |会话|在   org.apache.cxf.binding.soap.interceptor.Soap11FaultInInterceptor.unmarshalFault(Soap11FaultInInterceptor.java:86)     在   org.apache.cxf.binding.soap.interceptor.Soap11FaultInInterceptor.handleMessage(Soap11FaultInInterceptor.java:52)     在   org.apache.cxf.binding.soap.interceptor.Soap11FaultInInterceptor.handleMessage(Soap11FaultInInterceptor.java:41)     在   org.apache.cxf.phase.PhaseInterceptorChain.doIntercept(PhaseInterceptorChain.java:308)     在   org.apache.cxf.interceptor.AbstractFaultChainInitiatorObserver.onMessage(AbstractFaultChainInitiatorObserver.java:112)     在   org.apache.cxf.binding.soap.interceptor.CheckFaultInterceptor.handleMessage(CheckFaultInterceptor.java:69)     在   org.apache.cxf.binding.soap.interceptor.CheckFaultInterceptor.handleMessage(CheckFaultInterceptor.java:34)     在   org.apache.cxf.phase.PhaseInterceptorChain.doIntercept(PhaseInterceptorChain.java:308)     在org.apache.cxf.endpoint.ClientImpl.onMessage(ClientImpl.java:798)     在   org.apache.cxf.transport.http.HTTPConduit $ WrappedOutputStream.handleResponseInternal(HTTPConduit.java:1653)     在   org.apache.cxf.transport.http.HTTPConduit $ WrappedOutputStream.handleResponse(HTTPConduit.java:1533)     在   org.apache.cxf.transport.http.HTTPConduit $ WrappedOutputStream.close(HTTPConduit.java:1330)     在   java.util.zip.DeflaterOutputStream.close(DeflaterOutputStream.java:241)     在   org.apache.cxf.io.AbstractWrappedOutputStream.close(AbstractWrappedOutputStream.java:77)     在   org.apache.cxf.io.AbstractThresholdOutputStream.close(AbstractThresholdOutputStream.java:102)     在   org.apache.cxf.io.CacheAndWriteOutputStream.postClose(CacheAndWriteOutputStream.java:56)     在   org.apache.cxf.io.CachedOutputStream.close(CachedOutputStream.java:215)     在   org.apache.cxf.transport.AbstractConduit.close(AbstractConduit.java:56)     在   org.apache.cxf.transport.http.HTTPConduit.close(HTTPConduit.java:652)     在   org.apache.cxf.interceptor.MessageSenderInterceptor $ MessageSenderEndingInterceptor.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(ClientImpl.java:423)处   org.apache.cxf.endpoint.ClientImpl.invoke(ClientImpl.java:324)在   org.apache.cxf.endpoint.ClientImpl.invoke(ClientImpl.java:277)在   org.apache.cxf.endpoint.ClientImpl.invoke(ClientImpl.java:297)在   org.apache.cxf.endpoint.ClientImpl.invoke(ClientImpl.java:283)在   sun.reflect.NativeMethodAccessorImpl.invoke0(本机方法)位于   sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)     在   sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)     在java.lang.reflect.Method.invoke(Method.java:498)在   org.apache.cxf.jaxws.JaxWsClientProxy.invoke(JaxWsClientProxy.java: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)

     

ERROR ExceptionHandler:39-客户端调试:空

密码参数需要密码摘要生成算法,其格式为:

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

是否不符合格式?

0 个答案:

没有答案