Как использовать MAC-адрес для идентификации компьютера?

#java

#java

Вопрос:

Я использовал этот код, чтобы получить MAC-адрес системы:-

 import java.net.InetAddress;
import java.net.NetworkInterface;
import java.net.SocketException;
import java.net.UnknownHostException;

public class App{

public static void main(String[] args){

InetAddress ip;
try {

    ip = InetAddress.getLocalHost();
    //System.out.println("Current IP address : "   ip.getHostAddress());

    NetworkInterface network = NetworkInterface.getByInetAddress(ip);

    byte[] mac = network.getHardwareAddress();

    System.out.print("Current MAC address : ");

    StringBuilder sb = new StringBuilder();
    for (int i = 0; i < mac.length; i  ) {
        sb.append(String.format("X%s", mac[i], (i < mac.length - 1) ? "-" : ""));        
    }
    System.out.println(sb.toString());

} catch (UnknownHostException e) {

    e.printStackTrace();

} catch (SocketException e){

    e.printStackTrace();

  }

  }

}
  

Итак, у меня есть несколько вопросов:-

  1. Как сохранить полученный MAC-адрес в текстовый файл?

  2. Как использовать этот текстовый файл (т.Е. MAC-адрес) для последующей идентификации устройства?

    Заранее спасибо 🙂

Комментарии:

1. Если у вас есть эти два вопроса, ваш код становится неактуальным

2. на самом деле я использую MAC для чего-то вроде борьбы с пиратством… поэтому, пожалуйста, помогите мне…

3. @DavidPostill Предполагается , что они уникальны. Повторное использование MAC-адресов приводит к поломке сетевого оборудования. Это все еще плохое использование для них, но полагаться на них для различения машин для других целей разумно.

4. @chrylis согласен, но, как я сказал выше, использование их для борьбы с пиратством не очень надежно, когда MAC-адрес может быть подделан, чтобы соответствовать тому, который требуется для запуска пиратской копии какого-либо программного обеспечения. Пиратская копия, вероятно, все равно будет запущена в другой сети…

5. Хорошо, я попытаюсь переключиться

Ответ №1:

Как сохранить полученный MAC-адрес в текстовый файл?

У вас уже есть код для этого в вашем вопросе. Все, что вам нужно сделать, это записать в файл, а не стандартный вывод. (И если вы не знаете, как это сделать… прочитайте урок: Базовый ввод-вывод.)

Как использовать этот текстовый файл (т.Е. MAC-адрес) для последующей идентификации устройства?

Прочитайте его в строку (см. Ссылку выше) и сравните строку с другой, которую вы создали таким же образом.


Помните, что большинство систем позволяют системному администратору изменять MAC-адрес сетевой карты. Следовательно, меры по борьбе с пиратством, основанные на проверке MAC-адресов, легко обойти.

Комментарии:

1. пожалуйста, предложите мне какие-либо другие способы борьбы с пиратством

2. @user3773579 Как можно защитить программное обеспечение от пиратства?

3. @user3773579 — Единственная надежная защита от пиратства — раздавать программное обеспечение бесплатно.

Ответ №2:

 public class MacAddress
{
   public static void Main(string[] argv)
   {
      int commlength, miblength, datastart, datalength;
      string nextmib, value;
      SNMP conn = new SNMP();
      string mib = "1.3.6.1.2.1.17.4.3.1.1";
      int orgmiblength = mib.Length;
      byte[] response = new byte[1024];

      nextmib = mib;

      while (true)
      {
         response = conn.get("getnext", argv[0], argv[1], nextmib);
         commlength = Convert.ToInt16(response[6]);
         miblength = Convert.ToInt16(response[23   commlength]);
         datalength = Convert.ToInt16(response[25   commlength   miblength]);
         datastart = 26   commlength   miblength;
         value = BitConverter.ToString(response, datastart, datalength);
         nextmib = conn.getnextMIB(response);
         if (!(nextmib.Substring(0, orgmiblength) == mib))
            break;

         Console.WriteLine("{0} = {1}", nextmib, value);
      }
   }
}


class SNMP
{
   public SNMP()
   {

   }

   public byte[] get(string request, string host, string community, string mibstring)
   {
      byte[] packet = new byte[1024];
      byte[] mib = new byte[1024];
      int snmplen;
      int comlen = community.Length;
      string[] mibvals = mibstring.Split('.');
      int miblen = mibvals.Length;
      int cnt = 0, temp, i;
      int orgmiblen = miblen;
      int pos = 0;

      // Convert the string MIB into a byte array of integer values
      // Unfortunately, values over 128 require multiple bytes
      // which also increases the MIB length
      for (i = 0; i < orgmiblen; i  )
      {
         temp = Convert.ToInt16(mibvals[i]);
         if (temp > 127)
         {
            mib[cnt] = Convert.ToByte(128   (temp / 128));
            mib[cnt   1] = Convert.ToByte(temp - ((temp / 128) * 128));
            cnt  = 2;
            miblen  ;
         } else
         {
            mib[cnt] = Convert.ToByte(temp);
            cnt  ;
         }
      }
      snmplen = 29   comlen   miblen - 1;  //Length of entire SNMP packet

      //The SNMP sequence start
      packet[pos  ] = 0x30; //Sequence start
      packet[pos  ] = Convert.ToByte(snmplen - 2);  //sequence size

      //SNMP version
      packet[pos  ] = 0x02; //Integer type
      packet[pos  ] = 0x01; //length
      packet[pos  ] = 0x00; //SNMP version 1

      //Community name
      packet[pos  ] = 0x04; // String type
      packet[pos  ] = Convert.ToByte(comlen); //length
      //Convert community name to byte array
      byte[] data = Encoding.ASCII.GetBytes(community);
      for (i = 0; i < data.Length; i  )
      {
         packet[pos  ] = data[i];
      }

      //Add GetRequest or GetNextRequest value
      if (request == "get")
         packet[pos  ] = 0xA0;
      else
         packet[pos  ] = 0xA1;

      packet[pos  ] = Convert.ToByte(20   miblen - 1); //Size of total MIB

      //Request ID
      packet[pos  ] = 0x02; //Integer type
      packet[pos  ] = 0x04; //length
      packet[pos  ] = 0x00; //SNMP request ID
      packet[pos  ] = 0x00;
      packet[pos  ] = 0x00;
      packet[pos  ] = 0x01;

      //Error status
      packet[pos  ] = 0x02; //Integer type
      packet[pos  ] = 0x01; //length
      packet[pos  ] = 0x00; //SNMP error status

      //Error index
      packet[pos  ] = 0x02; //Integer type
      packet[pos  ] = 0x01; //length
      packet[pos  ] = 0x00; //SNMP error index

      //Start of variable bindings
      packet[pos  ] = 0x30; //Start of variable bindings sequence

      packet[pos  ] = Convert.ToByte(6   miblen - 1); // Size of variable binding

      packet[pos  ] = 0x30; //Start of first variable bindings sequence
      packet[pos  ] = Convert.ToByte(6   miblen - 1 - 2); // size
      packet[pos  ] = 0x06; //Object type
      packet[pos  ] = Convert.ToByte(miblen - 1); //length

      //Start of MIB
      packet[pos  ] = 0x2b;
      //Place MIB array in packet
      for(i = 2; i < miblen; i  )
         packet[pos  ] = Convert.ToByte(mib[i]);
      packet[pos  ] = 0x05; //Null object value
      packet[pos  ] = 0x00; //Null

      //Send packet to destination
      Socket sock = new Socket(AddressFamily.InterNetwork, SocketType.Dgram,
                       ProtocolType.Udp);
      sock.SetSocketOption(SocketOptionLevel.Socket,
                      SocketOptionName.ReceiveTimeout, 5000);
      IPHostEntry ihe = Dns.Resolve(host);
      IPEndPoint iep = new IPEndPoint(ihe.AddressList[0], 161);
      EndPoint ep = (EndPoint)iep;
      sock.SendTo(packet, snmplen, SocketFlags.None, iep);

      //Receive response from packet
      try
      {
         int recv = sock.ReceiveFrom(packet, ref ep);
      } catch (SocketException)
      {
         packet[0] = 0xff;
      }
      return packet;
   }

   public string getnextMIB(byte[] mibin)
   {
      string output = "1.3";
      int commlength = mibin[6];
      int mibstart = 6   commlength   17; //find the start of the mib section
      //The MIB length is the length defined in the SNMP packet
     // minus 1 to remove the ending .0, which is not used
      int miblength = mibin[mibstart] - 1;
      mibstart  = 2; //skip over the length and 0x2b values
      int mibvalue;

      for(int i = mibstart; i < mibstart   miblength; i  )
      {
         mibvalue = Convert.ToInt16(mibin[i]);
         if (mibvalue > 128)
         {
            mibvalue = (mibvalue/128)*128   Convert.ToInt16(mibin[i 1]);
            i  ;
         }
         output  = "."   mibvalue;
      }
      return output;
   }
}
  

Комментарии:

1. Я получил это отсюда