Получить уникальный идентификатор компьютера из PHP

Я создал приложение с использованием PHP и собираюсь продать его на местном рынке. Я лично поеду в их места, чтобы установить / настроить Apache и MySQL, а также установить свой собственный код.

Мне нужна система безопасности, чтобы, если кто-то попытается скопировать мой код на неавторизованный компьютер, он не запустится.

Я знаю, что никто не может помешать обратному проектированию приложения. даже.exe (бинарные) файлы взломаны и с PHP (исходным кодом) любой может это сделать.

В моей стране этих реверс-инженеров найти очень сложно, поэтому я хотел бы предложить минимальные варианты безопасности, такие как:

1) Создать класс (скажем, Navigation), которая идентифицирует системную информацию, такую ​​как идентификатор процессора, имя компьютера или любую комбинацию идентификатора оборудования, чтобы сделать UNIQUE_ID, и совпадает с моим заданным UNIQUE_ID (для лица, которому я продал приложение). Если он действителен, он возвращает меню навигации. В противном случае он просто уничтожит базу данных и остановит выполнение, выдав исключение, например:

class Navigation {

    public function d() {
        return current system UNIQUE_ID;
    }

    public function get() {
        $a = file_get_contents('hash');
        $c = $this->d();
        if (crypt($c) != $a) {
            //destory database
            throw new Exception('');
        } else {
            return "<ul><li><a>home</a></li></ul>"; //navigation menu
        }
    }

}

2) Затем в процессе установки я изменю системный UNIQUE_ID в "хэш-файле", создаю объект и сохраняю его в файл (nav.obj):

(Install.php)

<?php
      $a=new Navigation;
      $out=serialize($a);
      file_put_contents('nav.obj', $out);

3) в header.php (который включается в каждый файл):

<?php
     $menu=file_get_contents('nav.obj');
     $menu=unserialize($a);
     echo $menu->get();
 ?>

Я знаю, что этот метод не является полным доказательством, но я уверен, что около 60% разработчиков PHP не смогут его взломать!

Теперь мне нужно только получить текущую систему UNIQUE_ID.

3 ответа

Я создал эту функцию, чтобы получить уникальный идентификатор на основе аппаратного обеспечения (UUID жесткого диска). Можно использовать различные ресурсы, такие как имена компьютеров, домены или даже размер жесткого диска, чтобы получить лучший подход в зависимости от ваших потребностей.

 function UniqueMachineID($salt = "") {
    if (strtoupper(substr(PHP_OS, 0, 3)) === 'WIN') {
        $temp = sys_get_temp_dir().DIRECTORY_SEPARATOR."diskpartscript.txt";
        if(!file_exists($temp) && !is_file($temp)) file_put_contents($temp, "select disk 0\ndetail disk");
        $output = shell_exec("diskpart /s ".$temp);
        $lines = explode("\n",$output);
        $result = array_filter($lines,function($line) {
            return stripos($line,"ID:")!==false;
        });
        if(count($result)>0) {
            $result = array_shift(array_values($result));
            $result = explode(":",$result);
            $result = trim(end($result));       
        } else $result = $output;       
    } else {
        $result = shell_exec("blkid -o value -s UUID");  
        if(stripos($result,"blkid")!==false) {
            $result = $_SERVER['HTTP_HOST'];
        }
    }   
    return md5($salt.md5($result));
}


echo UniqueMachineID();

Согласно http://man7.org/linux/man-pages/man5/machine-id.5.html

$machineId = trim(shell_exec('cat /etc/machine-id 2>/dev/null'));

РЕДАКТИРОВАТЬ для Тито:

[ekerner@**** ~]$ ls -l /etc/machine-id
-r--r--r--. 1 root root 33 Jul  8  2016 /etc/machine-id

РЕДАКТИРОВАТЬ 2 для Тито: некоторые вещи для рассмотрения и сценарии:

Разрешено ли пользователю получать новую машину? Я думаю, да. Или работать на нескольких устройствах? Похоже, машина может быть неуместна в вашем случае?

Если его пользователь только (без ограничений компьютера), то я бы пошел на службу лицензирования (зависит от сети). Для этого существует множество сервисов: Google Play (для приложений Android) является хорошим примером: https://developer.android.com/google/play/licensing/index.html MS и Apple имеют схожие сервисы. Однако просто поищите в Интернете термин "Служба лицензирования программного обеспечения" или "Служба лицензирования программного обеспечения на основе облака".

Если его пользователь + отдельное устройство, то вам нужно будет передать идентификатор устройства любой службе, которую вы используете или делаете, а затем разрешить обновление идентификатора машины, но не разрешить вернуться к предыдущему идентификатору машины (это будет означать несколько устройств). Однако указанные службы предоставят вам код клиента, который должен позаботиться об этом, если это необходимо.

Два сценария из опыта: 1. Пользователь на любом устройстве: мы просто создали API в облаке (на веб-сайте) и экран входа в приложение, когда пользователь вошел в систему, аутентифицировался через API и сохранил токен, и всякий раз, когда устройство было подключено к сети, приложение запрашивало API и обновляло логин и / или токен. В качестве альтернативы вы можете иметь экран входа в систему при покупке (как, может быть, они уже вошли на сайт для покупки), сгенерировать ключ и упаковать его или связать в приложении.

2: пользователь плюс компьютер: то же самое, кроме тех случаев, когда API запрашивается, передается идентификатор компьютера. Идентификатор машины может изменяться столько раз, сколько пользователь обновляет свое устройство, но мы вели учет идентификаторов машин и запретили правило: если мы увидели старый (ранее использовавшийся) идентификатор машины, то должно было пройти определенное количество времени. прошло. Это позволило пользователю сломать свою машину и вытащить старую.

Также подумайте, если вы сделаете один, как вы остановите работу приложения? Ppl довольно умный, его нужно будет скомпилировать ядром.

Тем не менее, несмотря на все сказанное, различные службы лицензирования являются профессионалами в этом деле и могут удовлетворить большинство потребностей. Плюс в своем опыте они уже преодолели ловушки безопасности. Я бы назвал один, который мне нравится, кроме твоего, чтобы искать.

Хорошо, если вы можете вернуться с положительными или отрицательными результатами от ваших следов.

      function getMachineId() {
    $fingerprint = [php_uname(), disk_total_space('.'), filectime('/'), phpversion()];
    return hash('sha256', json_encode($fingerprint));
}

Это получит, вероятно, уникальный идентификатор на основе хеша:

  1. ОС сервера, версия ОС, имя хоста и архитектура.
  2. Общее место (не свободное место) на диске, где находится php-скрипт.
  3. Отметка времени Unix о времени создания корневой файловой системы компьютера.
  4. Текущая установленная версия PHP.

В отличие от других ответов, это не зависит отshell_exec()включен.

Другие вопросы по тегам