Ver Mensaje Individual
  #2 (permalink)  
Antiguo 06/04/2011, 07:06
notsuku
 
Fecha de Ingreso: marzo-2010
Mensajes: 5
Antigüedad: 14 años, 9 meses
Puntos: 0
Respuesta: GetResponsebody o getInputStream con Digest authorization y encriptacion m

He encontrado la solución para la autenticación md5-sess

* Primer paso: Calcular el nonce y el realm con una petición:

HttpClient client = new HttpClient();
GetMethod getMethod = new GetMethod(host+urlStr+parameters);
client.executeMethod(getMethod);
Header wwAuthHeader = getMethod.getResponseHeader("WWW-Authenticate");
for (HeaderElement element : wwAuthHeader.getElements())
{
if(element.getName().equals("nonce"))
nonce = element.getValue();
if(element.getName().equals("realm"))
realm = element.getValue();
}


*Segundo paso: Calcular el response:

String user = "usuario";
String password = "contrasenia";
String cnonce = "inventado";
String nc = "00000001";
String qop = "auth";
String A1 = MD5Encrypt(user+":"+realm+":"+password)+":"+nonce+ ":"+cnonce;
String response = MD5Encrypt(MD5Encrypt(A1)+":"+nonce+":"+nc+":"+cno nce+":"+qop+":"+ MD5Encrypt("GET:"+urlStr));

* La función MD5Encrypt hace lo siguiente:
private String MD5Encrypt(String text)
{
try
{
byte b[] = java.security.MessageDigest.getInstance("MD5").dig est((text).getBytes());
java.math.BigInteger bi = new java.math.BigInteger(1,b);
String s = bi.toString(16);
while(s.length() < 32)
s="0"+s;
return s;
}
catch(Exception e)
{
e.printStackTrace();
}
}


* Tercer paso: Realizar la peticion y salvarla en un xml (por ejemplo):

URL url = new URL(urlStr);
URLConnection urlCon = url.openConnection();
String header = "username=\""+user+"\",realm=\""+realm+"\",nonce=\ ""+nonce+"\",uri=\""+urlStr+"\",cnonce=\""+cnonce+ "\",nc="+nc+",algorithm=MD5-sess,response=\""+response+"\",qop=\""+qop+"\",cha rset=utf-8";
urlCon.setRequestProperty("Authorization", "Digest "+header);

InputStream is = urlCon.getInputStream();
FileOutputStream fos = new FileOutputStream("C:/temp.xml");

byte[] array = new byte[1000];
int step = is.read(array);
while (step > 0)
{
fos.write(array, 0, step);
step = is.read(array);
}
is.close();
fos.close();


* Ahora mi problema es: ¿Cómo puedo evitar el prompt de IE para poder realizar mi código que muestro arriba?