Как я могу получить MAC-адрес клиента с помощью java?

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

Я столкнулся с проблемой. Я вообще не могу получить клиентский Mac и понятия не имею, как это сделать. Помоги мне, пожалуйста :(

PS: я использую стандартные библиотеки java nio.

Мой код:

    ServerSocketChannel ssc = (ServerSocketChannel) key.channel();
    SocketChannel client = ssc.accept();

    char [] tempIP = client.socket().getInetAddress().toString().toCharArray();
    StringBuilder temp = new StringBuilder ();
    for (char ch : tempIP) {
        if (ch == '/')
            continue;
        temp.append(ch);
    }

    String clientIP = temp.toString();
    System.out.println(clientIP);
    InetAddress address = InetAddress.getByName(clientIP);
    NetworkInterface ni = NetworkInterface.getByInetAddress(address);
    if (ni != null) {
        byte [] mac = ni.getHardwareAddress();
        if (mac != null) {
            for (int i=0; i!=mac.length; i++) {
                System.out.format("%02X%s", mac[i], (i < mac.length - 1) ? "-" : "");

            }
        } else {
            System.out.println("Address doen't not exist or is not accessiable");
        }
    } else {
        System.out.println("Network Interface for the specified address is not found!");
    }

    client.configureBlocking(false);
    client.setOption(StandardSocketOptions.SO_KEEPALIVE, true);
    client.setOption(StandardSocketOptions.TCP_NODELAY, true);
    client.register(selector, SelectionKey.OP_READ);
    System.out.println("Client is connected!");

person Mikhail Dedyukhin    schedule 22.07.2018    source источник
comment
Код работает на стороне сервера?   -  person zhh    schedule 22.07.2018
comment
Да! Я не могу просто получить MAC-адрес клиента.   -  person Mikhail Dedyukhin    schedule 22.07.2018
comment
Вы находите NetworkInterface по IP-адресу клиента на стороне сервера. Вы должны найти NetworkInterface на стороне клиента и отправить клиентский Mac на сервер через сокет.   -  person zhh    schedule 22.07.2018
comment
Спасибо, нет ли вообще возможности получить mac адрес на сервере? :(   -  person Mikhail Dedyukhin    schedule 22.07.2018
comment
Насколько я знаю, вы не можете. Mac-адрес не содержится в пакете tcp / udp. Вы можете получить Mac на стороне клиента и отправить его на сторону сервера, а затем проверить.   -  person zhh    schedule 22.07.2018
comment
Один из способов установить доверие - использовать шифрование и подписи, чтобы позволить держателям определенных частных / открытых ключей подключаться. например как это делает SSL.   -  person Peter Lawrey    schedule 22.07.2018
comment
@zhh Это нормально для сбора этой информации, но так же безопасно, как запрос имени пользователя.   -  person Peter Lawrey    schedule 22.07.2018
comment
Спасибо вам всем! Я попробую ^)   -  person Mikhail Dedyukhin    schedule 22.07.2018
comment
Если вы можете получить доступ к локальному кешу ARP сервера, он сообщит вам MAC-адрес, который соответствует IP-адресу машины в локальной сети. Однако, если IP-адрес клиента маршрутизируется через шлюз, настоящий MAC-адрес не будет доступен. (И поскольку клиент может иметь возможность изменить свой MAC-адрес, в любом случае это не очень полезно ... как указывает Питер.)   -  person Stephen C    schedule 22.07.2018