摘要认证过程中的nonce

时间:2014-03-21 10:52:05

标签: java digest-authentication

我想知道摘要认证中的 nonce 的用法及其示例。这是我的身份验证方法。

        DefaultHttpClient httpclient = new DefaultHttpClient();
        URL urlObj;
        try {
            urlObj = new URL(url);

            HttpHost host = new HttpHost(urlObj.getHost(), urlObj.getPort(), urlObj.getProtocol());
            HttpGet job = new HttpGet(url);

            digestAuth.overrideParamter("realm", realm);
            digestAuth.overrideParamter("nonce", nonce);

            authCache.put(host, digestAuth);


            localcontext.setAttribute(ClientContext.AUTH_CACHE, authCache);

            HttpResponse response2 = httpclient.execute(job);
            StatusLine status = response2.getStatusLine();

            if(status.getStatusCode() == 401) {
                httpclient.close();
                httpclient = new DefaultHttpClient();
                Header header = response2.getFirstHeader(AUTH.WWW_AUTH);
                Map<String, String> map = parseAuthResponse(header);

                realm = map.get("realm");
                nonce = map.get("nonce");

                digestAuth.overrideParamter("realm", realm);

                digestAuth.overrideParamter("nonce", nonce);

                authCache.put(host, digestAuth);

                localcontext.setAttribute(ClientContext.AUTH_CACHE, authCache);

                httpclient.getCredentialsProvider().setCredentials(
                                            new AuthScope(urlObj.getHost(), AuthScope.ANY_PORT),
                                            new UsernamePasswordCredentials("username", "password"));
                response2 = httpclient.execute(job);

            }

在主要方法中,

    public static void main(String[] args) {
            digestAuth = new DigestScheme();
            authCache = new BasicAuthCache();
            localcontext = new BasicHttpContext();

            download("url1");
            download("url2");
        }

我想通过 nonce 跳过第二次下载的身份验证。那可能吗? 根据我的理解,维基说我可以将 nonce 重用于下一个请求。我想知道 nonce 的正确用法。我可以这样使用吗?

1 个答案:

答案 0 :(得分:1)

nonce是一个使用ONCE的数字,因此只能使用一次以防止不同类型的攻击。<​​/ p>

服务器设置现时,而不是你,所以正确的用法不是设置它。

正如HttpClient documentation所说:

  

在HTTP 1.1协议中添加了摘要式身份验证,而没有   与基本身份验证一样受到广泛支持的是一个很好的   对它的支持。摘要式身份验证显着更多   安全比基本身份验证,因为它永远不会传输实际   网络密码,而是使用它来加密“nonce”   从服务器发送的值。

RFC 2617解释如下:

  

随机数         应该唯一生成的服务器指定的数据字符串         每次401响应。

并且

  

nonce对客户端不透明。

您可能想要的是来自服务器的Cookie。经过身份验证后,服务器可以为您发出会话cookie。因此,如果您不想再次进行身份验证,则需要set that session cookie服务器(通常)在身份验证后提供给您,在您的请求中应该这样做。