从PHP获取计算机唯一ID

从PHP获取计算机唯一ID,php,unique-id,cpuid,hardware-id,Php,Unique Id,Cpuid,Hardware Id,我已经用PHP创建了一个应用程序,我将把它卖给我的本地市场。我将亲自前往他们的位置安装/配置Apache和MySQL,并安装我自己的代码 我想要一个安全系统,这样如果有人试图将我的代码复制到未经授权的机器上,它就不会运行 我知道没有人能阻止应用程序的逆向工程。甚至.exe(二进制)文件也被破解,任何人都可以用PHP(源代码)来破解 在我的国家,很难找到这些逆向工程师,因此我想提出最低限度的安全选项,如: 1) 创建类(例如,Navigation),该类标识系统信息,如CPU ID、计算机名称或硬

我已经用PHP创建了一个应用程序,我将把它卖给我的本地市场。我将亲自前往他们的位置安装/配置Apache和MySQL,并安装我自己的代码

我想要一个安全系统,这样如果有人试图将我的代码复制到未经授权的机器上,它就不会运行

我知道没有人能阻止应用程序的逆向工程。甚至.exe(二进制)文件也被破解,任何人都可以用PHP(源代码)来破解

在我的国家,很难找到这些逆向工程师,因此我想提出最低限度的安全选项,如:

1) 创建类(例如,
Navigation
),该类标识系统信息,如CPU ID、计算机名称或硬件ID的任何组合,以生成唯一的\u ID,并与我给定的唯一\u 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
        }
    }

}
类导航{
公共职能d(){
返回当前系统唯一的\u ID;
}
公共函数get(){
$a=文件内容(“哈希”);
$c=$this->d();
如果(密码($c)!=a){
//破坏数据库
抛出新异常(“”);
}否则{
返回“
  • 主页”
”;//导航菜单 } } }
2) 然后在安装过程中,我将更改“hash”文件中的系统唯一\u ID,创建一个对象,并将其保存到一个文件(nav.obj)中:

(install.php)


我创建此函数是为了根据硬件(硬盘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();
依照

为Tito编辑:

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

蒂托的编辑2:需要考虑的一些情况和场景:

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

如果仅限其用户(无机器限制),则Id将使用许可证服务(依赖于网络)。 这方面有很多服务: Google Play(适用于Android应用程序)就是一个很好的例子: 微软和苹果也有类似的服务。 但是,只需在web上搜索术语“软件授权服务”或“基于云的软件授权服务”

如果其用户+单个设备,则需要将设备id传递给您使用的任何服务或制作的任何服务,然后允许更新机器id,但不允许恢复到以前的机器id(将意味着多个设备)。 但是,上述服务将为您提供客户代码,如果需要,客户代码应予以处理

根据经验,有两种情况: 1:任何设备上的用户:我们只需在云中(在网站中)制作一个API,并在应用程序中创建一个登录屏幕,当用户通过API登录并保留令牌时,只要设备连接到网络,应用程序就会查询API并更新登录和/或令牌。 您也可以在购买时使用登录屏幕(比如他们可能已经登录到网站进行购买),生成一个密钥并将其打包或绑定到应用程序中

2:用户加机器: 除了在查询API时传递机器id外,其他情况都是一样的。当用户更新他们的设备时,机器ID可以改变很多次,但我们保留了机器ID的记录,并制定了禁止规则:如果我们看到一个旧的(以前使用过的)机器ID,那么一定的时间必须过去。因此,用户可以打破他们的机器,并拔出一个旧的

还考虑如果你做一个,你将如何停止应用程序的工作?Ppl非常聪明,它需要核心编译

然而,尽管如此,各种许可证服务在这方面是专业的,能够满足大多数需求。此外,根据他们的经验,他们已经克服了安全隐患。我想说出一个我喜欢的,除了你的以外


如果你能从你的训练中获得积极或消极的结果,那就太好了。

DOMAIN呢?将其设置为应该工作的域对其进行一些哈希并检查。没有系统唯一的ID。现在,当你公开发布此内容时,这60%将下降到10%…陌生人会让你在他们的计算机上安装此内容吗?weirdI估计识别和禁用该功能大约需要10分钟。不要在上面浪费时间-集中精力销售您的服务。您有没有不使用shell_exec的替代方案?请为上述代码提供一个示例diskpartscript.txt文件。它应该是什么样子?
$result=shell_exec(“blkid-o value-s UUID”)
在没有可用的
blkid
命令的系统上,结果将是一个空字符串,因此无法满足下面的条件。一个可能的修复方法是将条件更改为
if(stripos($result,'blkid')!==FALSE | |!$result){
该/etc/machine id文件包含本地系统的唯一计算机id,您可以使用工作系统轻松修改该计算机id。
可以在重新启动时更改该计算机id。其授权用途是什么?不,您不能轻松修改该计算机id文件。它属于root用户,并且是只读的。任何明智的系统管理员都不会更改它。Ill请编辑上面的内容。@ekerner那么,它是用于授权目的的可靠工具吗?@user4271704取决于您试图授权什么,以及您试图将其授权给什么。授权软件/硬件/服务?授权给软件/硬件/用户?您是否阅读了手册页(上面的链接)。
 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();
$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