从PHP获取计算机唯一ID

mbjcgjjk  于 2022-12-25  发布在  PHP
关注(0)|答案(2)|浏览(410)

我用PHP创建了一个应用程序,我打算把它卖给我当地的市场。我会亲自去他们的地方安装/配置Apache和MySQL,以及安装我自己的代码。
我想要一个安全系统,这样,如果有人试图复制我的代码到一个未经授权的机器,它不会运行。
我知道没有人可以阻止逆向工程的应用程序。甚至.exe(二进制)文件被破解,与PHP(源代码)任何人都可以做。
在我的国家,这些逆向工程师真的很难找到,所以我想建议最低限度的安全选项,如:
1)创建一个类(比如Navigation),它可以识别系统信息,比如CPU ID、计算机名或硬件ID的任意组合,从而生成一个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)然后在安装过程中,我将更改“hash”文件中的系统UNIQUE_ID,创建一个对象,并将其保存到一个文件(nav.obj)中:
(安装. 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。

enyaitl3

enyaitl31#

我创建了这个函数来获取基于硬件的唯一ID(硬盘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();
j2datikz

j2datikz2#

按照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和苹果也有类似的服务。不过,只要在网上搜索“软件许可服务”或“基于云的软件许可服务”就可以了。
如果它的用户+单个设备,那么你需要把设备ID传递给你使用的任何服务或使,然后允许机器ID被更新,但不允许恢复到以前的机器ID(将意味着多个设备)。然而,如果它是一个要求,所说的服务将给予你的客户端代码应该照顾。
经验中的两种情景:1:任何设备上的用户:我们只是在云中创建了一个API(在网站中)和应用程序中的登录屏幕,当用户登录时通过API进行身份验证并保留令牌,每当设备连接到网络时,应用程序将查询API并更新登录和/或令牌。您也可以在购买时拥有登录屏幕(比如他们可能已经登录到某个网站进行购买),生成密钥并将其打包或绑定到应用程序中。
2:用户加机器:相同的事情,除了当API被查询时,机器ID被传递。机器ID可以随着用户更新他们的设备而多次更改,但我们保留了机器ID的记录,并制定了禁止规则:如果我们看到一个旧的(以前使用过的)机器id,那么一定已经过去了一定的时间。因此允许用户打破他们的机器,并拉出一个旧的。
另外要考虑的是,如果你做了一个,你将如何停止应用程序的工作?Ppl是相当聪明的,它将需要核心编译。
然而,尽管如此,各种许可服务在这方面都很专业,可以满足大多数需求。另外,根据他们的经验,他们已经克服了安全隐患。我会说出一个我喜欢的,除了它是你的搜索。
如果你能从你的足迹中带着积极或消极的结果回来,那就太好了。

相关问题