从PHP获取计算机唯一ID

时间:2013-07-08 09:26:13

标签: php unique-id cpuid hardware-id

我使用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):

(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。

2 个答案:

答案 0 :(得分:17)

我已创建此功能以获取基于硬件(硬盘UUID)的唯一ID。可以根据您的需要使用不同的资源,如机器名称,域甚至硬盘大小,以获得更好的方法。

 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();

答案 1 :(得分:0)

根据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

Tito的EDIT 2:需要考虑的一些事项和场景:

是否允许用户购买新机器?我想是的。 或者在多个设备上运行? 听起来机器可能与你的情况无关?

如果仅限用户(没有机器限制),那么Id将获得许可服务(依赖于网络)。 有很多服务: Google Play(适用于Android应用)就是一个很好的例子:https://developer.android.com/google/play/licensing/index.html MS和Apple也有类似的服务。 但是,只需在网上搜索术语&#34;软件许可服务&#34;或者&#34;基于云的软件许可服务&#34;。

如果是用户+单个设备,那么您需要将设备ID传递给您使用或make 的任何服务,然后允许更新计算机ID,但不允许恢复到以前的计算机id(意味着多个设备)。 但是,所述服务将为您提供客户端代码,如果需要,应该对其进行处理。

经验中的两种情景: 1:任何设备上的用户:我们只是在云中(在网站中)和应用程序中的登录屏幕上创建API,当用户登录时通过API进行身份验证并保留令牌,以及设备何时连接到应用程序将查询API并更新登录和/或令牌。 您也可以在购买时使用登录屏幕(例如他们已经登录到要购买的网站),生成密钥并将其打包或绑定到应用程序中。

2:用户加机器: 同样的事情,除了查询API时,机器ID被传递出去。机器ID可以随着用户更新设备而改变多次,但是我们保留了机器ID的记录并禁止对其进行规则:如果我们看到旧的(以前使用过的)机器ID,那么必须有一定的时间通过。因此允许用户打破他们的机器并取出旧机器。

另外要考虑一下,如何阻止应用程序运行? Ppl很聪明,需要核心编译。

然而,尽管如此,各种许可服务都是专业的,可以满足大多数需求。除了他们的经验,他们已经克服了安全隐患。我喜欢用自己喜欢的名字来搜索它。

如果您可以从您的小径中获得积极或消极的结果,那就太好了。