Alguns aplicativos dos tipos desktop, servico ou licenciadores baseados em processamento fortemente identificado sempre requerem do programador desafios novos para pegar a identidade fisica do computador.Quando surge o problema de pegar uma identidade sempre vem a cabeca do programador mais experiente as seguintes perguntas seguidas por mais perguntas:1) Se eu pegar o macaddress da placa de rede?2) Mas se a placa de rede queimar ou for trocada de posicao?3) Posso obter o numero mais seguro?4) Sera este numero o codigo de serie da CPU porque o FCC cuida para nao haver repeticao de serial, ok?5) Mas a maquina pode ser virtual e copiada, o macaddress e codigo da CPU podem ser clonados e assim o FCC perder controle?6) Talvez o nome da maquina possar ser menos sujeito a alteracao e se tiver clone, nao vai funcionar na mesma rede, mas sera que numa mudanca de politica de infra-estrutura nao vao mudar o nome da maquina legalmente?7) Como faco para saber se a maquina e virtual?Nao existe uma formula magica para impedir as alteracoes das identidades de uma maquina, ate de seu processador porque pode ser trocado.Em caso de maquinas virtuais o problema e agravado mais ainda porque elas podem ser clonadas e funcionarem com identidades identicas em redes (LAN) diferentes.Por causa disso a unica forma segura de garantir uma identidade unica e resolvida atraves de tags ou tokens em forma de hardware para imprimir uma identidade imutavel, no entanto, este metodo pode ser bastante caro e ainda reduzir bastante a atratividade de seu aplicativo num cenario mundial onde as pessoas buscam fazer as coisas no menor tempo, da forma mais simples e mais barata.Mas nao se desespere, para a maior parte dos casos, obter a identidade na primeira execucao do software e persistir em um arquivo, registro do sistema operacional ou banco de dados de maneira ofuscada ja e o suficiente para congelar e tornar imutavel o conjunto de identidades da maquina. Esta tecnica pode ser chamada de congelar ou tirar um snapshot dos identificadores da maquina para nao sofrerem uma crise caso uma identidade utilizada para validacao de sua aplicacao seja legalmente mudada por razoes diversas.A classe a seguir se chama ComputerInfo e possui metodos para obter o numero de serie da CPU, endereco IP do computador, nome do computador, macaddress do primeiro adaptador de rede e se e um adaptador virtual. Nao e objetivo discutir a utilizacao desta classe porque isso vai variar da necessidade de solucao de cada um.A classe ComputerInfoCrie um arquivo classe chamado ComputerInfo.java:import java.io.BufferedReader;import java.io.File;import java.io.FileWriter;import java.io.InputStreamReader;import java.net.InetAddress;import java.net.NetworkInterface;import java.net.SocketException;import java.net.UnknownHostException;import java.util.Collections;import java.util.StringTokenizer;public class ComputerInfo { public static final String NO_CPU_ID = "XXXXXXXXXX"; private static ComputerInfo ci = null; private String cpuSerial; private String hostName; private String macAddress; private String hostAddress; private boolean virtualAdapter; private ComputerInfo() { try { NetworkInterface netInter = null; if (OS.OS == OS.WINDOWS) { InetAddress localHost = InetAddress.getLocalHost(); netInter = NetworkInterface.getByInetAddress(localHost); } else if (OS.OS == OS.LINUX) { for (NetworkInterface n : Collections.list(NetworkInterface.getNetworkInterfaces())) { netInter = n; break; } } byte[] macAddressBytes = netInter.getHardwareAddress(); String macAddress = ""; // Verifica se obteve