【问题标题】:How to implement an API key on PHP software?如何在 PHP 软件上实现 API 密钥?
【发布时间】:2011-05-25 01:08:48
【问题描述】:

我正在分发一个 PHP 创建的插件,如 Wordpress 插件,但我想为它实现一个 API 密钥,用户需要输入一个 API 密钥来解锁它才能工作。

如何做到这一点?是的,我已经知道它很容易被绕过,因为 PHP 没有被编译,但至少它会阻止一些没有 PHP 知识的人。

谢谢..

【问题讨论】:

  • 它甚至不会真正阻止他们;这些知识将删除检查并使该版本可用;那些不知道的人会使用它来代替 - 查看所有那些曾经在 DVD 上的电影,其加密超出了大多数用户的删除能力,但现在无需任何加密即可轻松访问。
  • API 密钥到底是什么意思?传统用法类似于“用于自动执行操作的 URL 的秘密组件”,但听起来您的意思是“产品密钥”。至于问题本身,你是对的 - 这真的是浪费时间,你不需要知道 PHP 来谷歌“[你的应用程序]密钥绕过”
  • @El Yobo ..实际上它会阻止他们...我看到很多插件都有这个 API 密钥...这里的重点是我真的不在乎它是否阻止他们,但我只想要这个功能..
  • 我不想吹毛求疵,但我相信你的意思是许可证密钥。
  • Rick,Akismet 实际上是一个真正的 API 密钥。它使用此 API 密钥与 Akismet 服务器通信以获取数据。您所描述的是许可证密钥。除非您使用此密钥与您的服务器进行通信以获取某种数据?

标签: php api key


【解决方案1】:

我认为您不了解 API 密钥是什么。

API 密钥是允许您或脚本访问 API 或在线服务并与之交互的密钥。

您似乎描述的是某种许可证密钥,它会阻止用户在没有付款或注册的情况下操作您的脚本。

虽然 API 密钥通常确实需要付款或注册,但这两者确实不是一回事。

API 密钥通常用于跟踪使用情况,并防止滥用在线服务和数据。

在您的情况下,您似乎只是试图限制对您的脚本的访问。

除非您的脚本对远程数据源具有基本依赖关系,否则此方法将不起作用,因为任何对 PHP 有一定了解的用户只会删除执行验证的代码。

对于 PHP,这同样适用于许可证密钥。用户会想办法绕过它,除非他们需要它来执行脚本。

验证必须远程执行,并且必须有一些激励措施使其保持原样(访问远程数据是显而易见的)。

【讨论】:

  • 是的,他说的是许可证密钥。
  • 对不起,我说的是 wp 上所有其他使用 api 密钥的插件......他们以同样的方式做......它......你用钥匙激活插件......我不知道为什么你们一直提到它会很容易破解......谁在乎?大多数会购买一个简单插件来使用的人不会知道如何破解它。知道如何破解的人甚至不会购买它,因为他们可以自己制作......
  • 您想要完成的事情是不可能以合法和安全的方式实现
  • 别傻了,正如 3-4 次提到的,这是由 WP 插件的开发人员一直在做的......它并不是“真正”意味着保护任何东西......它只是一个在插件工作之前简单激活...就是这样,仅此而已...最重要的是跟踪谁在使用它...
【解决方案2】:

您可以使用 API 密钥对实际源代码进行加扰。加密源代码的一些重要部分(例如使用 libmcrypt),并让脚本加载和解密源代码。当然,找到相关例程的人可以轻松地将源转储到磁盘并使用它,但这不会像删除检查那么简单。

【讨论】:

  • 感谢您的建议,但这已经比我需要的更先进了...从逻辑的角度来看,我的想法是我可以生成一组密钥,并且在安装软件后,一个数据库已创建...当用户获得密钥时,他们会将其输入软件并激活整个程序,然后将密钥放入数据库。在激活过程中,他们输入的密钥会在某处的服务器上进行检查...
【解决方案3】:

这绝对没有意义。作为它的 php,您必须发送源代码,任何用户都可以删除许可证检查代码并运行它。

除了人们不喜欢弄乱许可证密钥之外,除非你的软件真的非常有用、可取或必不可少,他们要么会找到一个免费的替代方案,要么就是不理会它。

【讨论】:

  • 对不起,你错了...我已经为许多客户使用了具有 api 密钥的插件,他们都回来找我购买新密钥...如果其中任何一个(大约 35人们)知道如何绕过检查,你认为他们不会?因为他们不知道如何...知道如何的人不会购买此插件...此插件适用于不了解 C++ 中 php 的最终用户...
  • @Rick,如果你以前做过,就做你上次做的。
  • 不,我以前没有做过..这不是我开发的...我只是为他们销售的会员...现在我想创建自己的插件...跨度>
【解决方案4】:

如果您不关心人们删除您的支票,那么您实际上只需要添加一个if 语句来验证配置的许可证密钥是否有效。

我注意到您提到您的许可证密钥只是 SHA1 哈希。您可以轻松地将额外的 4 个字符附加到哈希中,您可以将其用作校验和。

例如:

function generate_key()
{
  $serial = sha1(uniqid(rand(), true));
  $checksum = substr(md5($serial), 0, 4);
  return $serial . $checksum;
}

function verify_key($key)
{
  $serial = substr($key, 0, 40);
  $checksum = substr($key, -4);
  return md5($serial, 0, 4) == $checksum;
}

这是一个非常简单的例子,但它只是指导性的。

基本上,您将验证许可证密钥在主机服务器上是否有效,而不是在您的服务器上 ping 脚本。

这样做的缺点是任何人都可以通过打开源代码并找到validate_key来生成有效密钥。

您可以让它调用外部脚本来执行verify_key,但这真的值得吗?此外,您将牺牲页面加载时间来验证密钥。

我记得 vBulletin 有一个非常容易破解的许可系统,但是他们在几个部分中有一个隐藏的 1x1 图像,可以在他们的域上 ping 一个脚本。使用这些日志,他们能够确定哪些域托管了他们软件的非法副本,他们只需向管理员发送一封律师函。

如果您想要一个更强大的解决方案,我建议您查看Zend Guard,但您似乎并不关心破解您的软件的人,所以我个人会尽可能简单。

【讨论】:

  • 是的,当代码是开源的时,开发复杂的加密系统真的没有多大用处……如果这是编译语言,那就另当别论了。我只需要一些简单的东西,所以使用这个软件的人不只是告诉他的朋友你去,使用它......因为我的计划是将他们的电子邮件与密钥匹配并在服务器端进行切换,所以即使他们通过了相同的电子邮件/密钥给他们的朋友,它会关闭他的朋友插件,他会很生气,学会永远不要让他的朋友那样使用它......
猜你喜欢
  • 1970-01-01
  • 2012-12-18
  • 2015-07-08
  • 2013-05-10
  • 2017-04-20
  • 1970-01-01
  • 1970-01-01
  • 2012-06-22
  • 1970-01-01
相关资源
最近更新 更多