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