【问题标题】:How to make a file that user can read, but not write?如何制作用户可以读取但不能写入的文件?
【发布时间】:2010-11-22 02:44:33
【问题描述】:

我想以加密文件的形式分发软件许可证。每次有人购买许可证时,我都会创建一个新文件并将其通过电子邮件发送出去,并附有将其放入特定目录的说明。

用户运行的 PHP 代码应该能够解密文件(并且代码被混淆以填充他破解该文件)。显然用户不应该能够编写类似的文件。

我们不要讨论这是否值得。我已被命令实施它,所以......我该怎么做?我可以使用公钥加密并给他一把钥匙吗?


我不能只给用户一把钥匙并保留另一把吗?他会读,我会写

【问题讨论】:

  • 显然...什么?你的要求毫无意义。你想阻止全世界的任何人创建一个看起来像你的文件?
  • 啊,我开始明白你的意图是什么了。请参阅我的答案以了解可能的情况。
  • “你想阻止全世界的任何人创建一个看起来像你的文件” - 我想阻止创建看起来像已加密的有效文件的东西 (+1)跨度>

标签: php encryption public-key-encryption


【解决方案1】:

如果您有一个文件只是说“是的,软件可能正在运行”,您当然不能阻止他复制该文件。

可以做的是使用特定于客户系统、客户名称或 IP 地址或其他东西的东西来加密文件。然后您可以让您的软件检查此 IP 地址或在所有报告或其他内容上打印客户姓名。

您可以使用简单的对称加密或使用签名来做到这一点,它们都不能阻止他篡改程序以找到密钥。所以告诉你的老板这是一个障碍,但肯定不是牢不可破的。

【讨论】:

  • +1 谢谢。我想我会把文件名放在里面,加密。如果文件被复制,名称将不匹配,我可以拒绝它。一个障碍就足够了;没有什么是牢不可破的。
  • @Mawg,如果文件被复制到另一个文件夹/机器,它仍然具有相同的名称,不会被拒绝。
【解决方案2】:

听起来您正在寻找的是数字签名。

当您创建许可文件时,您使用您的私人 密钥对其进行签名。当应用程序加载许可证文件时,它会使用您的 public 密钥验证签名,该密钥被硬编码到您的混淆许可证检查中。

显然,用户可以自己修补许可证检查代码 - 要么用他们自己的公钥替换你的公钥,要么完全避免许可证检查 - 但你真的无能为力。

【讨论】:

    【解决方案3】:

    简单的 RSA 加密无法解决您的问题,一旦代码清晰,任何人都可以得到它。

    更好的问题是“我愿意付出多少努力让我的客户难以获得我的代码?”不管是哪种语言和方法,最终都会运行,运行时可以读取。

    唯一的万无一失的方法是自己托管它,并且不允许您的客户端或他的服务器访问您的代码。

    【讨论】:

    • 它只会在 RAM 中保持清晰,这对我来说已经足够了。
    【解决方案4】:

    您可以使用FlexNet Publisher License System 之类的许可证。

    FlexNet 许可证有两个方面。首先是确定一个站点是否具有许可证。这可以根据 IP、Mac 地址或处理器的内部 ID 来完成。

    获得站点许可后,该站点的许可可以在活跃用户的基础上完成(您可以拥有数千个用户,但一次只能有十个用户可以使用该软件)、单机许可(您有十个站点上可以使用它的用户,并且只有那些人可以使用它。如果第十一个人想要它,则站点必须将许可证从一个获得许可的人转移给该新用户。或者,购买更多许可证)。而且,您可以拥有无​​限用户的站点许可证。

    FlexNet 许可可以被破坏,但通常很强大,可以向您报告违反许可政策的情况。

    当然,您必须向 Flexera Software 支付许可费才能使用他们的许可方案。而且,FlexNet 许可计划甚至可能有某种“开源”实现,尽管我不知道有哪一种。

    我从未使用过它,因为我完全相信开源软件理念。这和事实比没有人会为我写的任何东西支付一分钱。

    【讨论】:

      【解决方案5】:

      您可能想要做的是使用 XOR 加密(用密钥对文件的每个 n 字节块进行 XOR),因为正如@AndreKR 所说,您实际上想要做的事情是不可能的,您可能想要签署加密文件使用您的私钥,然后您可以验证加密是由您完成的。

      当然,如果您不每次都检查这一点,并且您不使用不透明的文件格式和编译/混淆的代码,那么它不会有太大的不同

      如果您要将数据显示给用户,一般情况下不可能停止数据的数字复制 - 在最坏的情况下,他们只能拍摄屏幕截图(甚至捕获发送到监视器的信号)

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-03-16
        • 1970-01-01
        • 1970-01-01
        • 2017-04-02
        • 1970-01-01
        • 2012-03-28
        相关资源
        最近更新 更多