Eu tenho um sistema web que utiliza um applet para validação de clientes, no qual ele efetua o cadastro da maquina e obtem como um dos itens de verificação o Mac Address.
Tenho esse sistema implementado a aproximadamente 1 ano já, e até a versão 1.6.0_21 do Java ele funcionava.
Essa ultima atualização (Java 1.6.0_22) que começou a me causar problemas.
Ele obtem qualquer informação, mas somente a função getHardwareAddress() me traz o valor null.
Eu tenho o seguinte codigo:
import java.io.UnsupportedEncodingException;
import java.net.MalformedURLException;
import java.net.NetworkInterface;
import java.net.SocketException;
import java.net.URL;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.util.Enumeration;
import java.applet.Applet;
import javax.swing.JOptionPane;
import netscape.javascript.JSObject;
public class Mac extends Applet {
public void init(){
String MaquinaSHA1 = null;
Enumeration en = null;
String aMaquinaSHA1 = null;
String sMensagemERRO = "Não foi possivel efetuar a verificação da estação de trabalho!\n" +
"Motivo: A versão do Java não é compativel!\n" +
"Versão requerida: Java 1.6+";
try {
//captura as interfaces de rede da máquina
en = NetworkInterface.getNetworkInterfaces();
} catch (SocketException ex) {
JOptionPane.showMessageDialog(null, sMensagemERRO +
"\n\nERRO: (01) Não foi possivel obter informações do computador!", "Sistema XXX", JOptionPane.ERROR_MESSAGE);
ex.printStackTrace();
}
//instancia um objeto interfa de rede
while (en.hasMoreElements()){
NetworkInterface ni = (NetworkInterface) en.nextElement();
// busca todas as informacoes da interface de rede
String enderecoMac = null;
//codigo para pegar o mac address
//instancia um array de byte
byte[] bytes = null;
try {
//pega o codigo em bytes
bytes = ni.getHardwareAddress();
} catch (SocketException ex) {
JOptionPane.showMessageDialog(null, sMensagemERRO +
"\n\nERRO: (02) Não foi possivel obter informações do computador!", "Sistema XXX", JOptionPane.ERROR_MESSAGE);
ex.printStackTrace();
}
//variavel auxiliar na transformacao de byte para hexa
StringBuilder aux = new StringBuilder();
if (bytes != null){
//laco para converter os bytes em hexa
for (int i = 0; i < bytes.length; i++) {
int parteAlta = ((bytes[i] >> 4) & 0xf) << 4;
int parteBaixa = bytes[i] & 0xf;
if (parteAlta == 0) {
aux.append('0');
}
//adiciona a aux o codigo referente o bytes[i]
aux.append(Integer.toHexString(parteAlta | parteBaixa));
}
//Pega a MAC joga em uma variavel como string
enderecoMac = aux.toString();
if ((enderecoMac != "") && (enderecoMac.length() == 12)){
// Gera a Chave com o SHA1, com todos os dados da maquina
try {
MaquinaSHA1 = SHA1(enderecoMac);
} catch (NoSuchAlgorithmException e) {
JOptionPane.showMessageDialog(null, sMensagemERRO +
"\n\nERRO: (03) Não foi possivel criptografar as informações!", "Sistema XXX", JOptionPane.ERROR_MESSAGE);
e.printStackTrace();
} catch (UnsupportedEncodingException e) {
JOptionPane.showMessageDialog(null, sMensagemERRO +
"\n\nERRO: (04) Não foi possivel criptografar as informações!", "Sistema XXX", JOptionPane.ERROR_MESSAGE);
e.printStackTrace();
}
// Joga todas as MAC em um array
if (aMaquinaSHA1 != ""){
aMaquinaSHA1 = aMaquinaSHA1 + "," + MaquinaSHA1;
}else{
aMaquinaSHA1 = MaquinaSHA1;
}
}
}
}
if ((aMaquinaSHA1 == null) || (aMaquinaSHA1 == "")){
JOptionPane.showMessageDialog(null, "ERRO: (05) Não foi possivel obter as informações do computador!", "Sistema XXX", JOptionPane.ERROR_MESSAGE);
}else{
try {
SetaDados(aMaquinaSHA1);
}catch (Exception e1){
try {
//Chama a funcao java script da tela
getAppletContext().showDocument(
new URL("javascript:getMaquina('" + aMaquinaSHA1 +"')")
);
}catch (MalformedURLException me){
try {
getAppletContext().showDocument(
new URL("https://www.XXX.com.br/java/default.asp?openjdk=1&id=" + aMaquinaSHA1)
);
} catch (MalformedURLException e2) {
JOptionPane.showMessageDialog(null, sMensagemERRO +
"\n\nERRO: (06) Não foi possivel enviar as informações!", "Sistema XXX", JOptionPane.ERROR_MESSAGE);
e2.printStackTrace();
}
}
}
}
}
private static String convertToHex(byte[] data) {
StringBuffer buf = new StringBuffer();
for (int i = 0; i < data.length; i++) {
int halfbyte = (data[i] >>> 4) & 0x0F;
int two_halfs = 0;
do {
if ((0 <= halfbyte) && (halfbyte <= 9))
buf.append((char) ('0' + halfbyte));
else
buf.append((char) ('a' + (halfbyte - 10)));
halfbyte = data[i] & 0x0F;
} while(two_halfs++ < 1);
}
return buf.toString();
}
public static String SHA1(String text) throws NoSuchAlgorithmException, UnsupportedEncodingException {
MessageDigest md;
md = MessageDigest.getInstance("SHA-1");
byte[] sha1hash = new byte[40];
md.update(text.getBytes("iso-8859-1"), 0, text.length());
sha1hash = md.digest();
return convertToHex(sha1hash);
}
public void SetaDados(String sMac){
JSObject objWin = JSObject.getWindow(this);
JSObject objDoc = (JSObject)objWin.getMember("document");
JSObject objForms = (JSObject)objDoc.getMember("forms");
JSObject objForm = (JSObject)objForms.getMember("form1");
JSObject objElements = (JSObject)objForm.getMember("elements");
JSObject campoDoFormularioHTML = (JSObject)objElements.getMember("txtChaveAcesso");
campoDoFormularioHTML.setMember("value", sMac);
objWin.call("sendMaquina", null);
}
}
Abraço!