【问题标题】:Checking serial code correctness检查序列码的正确性
【发布时间】:2010-12-22 09:41:12
【问题描述】:

我在 java 中有一个方法,它根据多个参数生成一个串行代码。

现在我想要另一种方法,它接受相同的参数+序列号,并告诉我这个序列号是否正确。但是,我不想暴露串行代码的创建方法,所以如果有人知道检查正确性的方法,他应该无法根据其他一些参数构造新代码。

这可能吗?

一些额外的重要信息。我无法更改生成串行代码的方法。否则我可以使用一些标准的公私钥算法。我想要的是:

methodICannotChange("someinput") returns serialcode
methodICanInvent(serialcode, "someinput") returns true or false

如果知道 methodICanInvent 的实现,“不可能”生成新的序列码。

【问题讨论】:

  • 谢谢。我认为这里的第一个答案可能非常有用,尽管它并不完全是我所希望的......
  • 在给定的约束条件下,这个问题基本上是无法解决的。假设串行代码生成算法可以生成任何长度为 12 个字符的可打印 ASCII 代码,其中 ASCII 值的总和是 256 的倍数。任何检查代码都将拒绝有效代码、接受无效代码或显示您的算法。

标签: java security


【解决方案1】:

为什么没有SerialCode 对象?将参数传递给构造函数。如果参数有效,则您的 SerialCode 对象将实例化。如果不是,则构造函数失败。

这样,您所有的SerialCode 对象都代表有效的序列号。您的客户可以通过拥有一个实例化的SerialCode 对象简单地断言有效性。

您可能希望提供SerialCodeFactory 来创建这些对象(有关工厂/工厂方法的信息,请参阅here),而不是将其公开给您的客户,而只是提供 SerialCode 对象(通过包范围或其他方式)。

【讨论】:

  • 我担心这并不能解决我的问题。我想防止有人能够通过反编译我的类文件来轻松创建自己的串行代码。
【解决方案2】:

序列码的安全性不得依赖于算法知识(即具有未知算法)和“公共”输入参数。

它应该只依赖于一个被锁住的秘密

serialNumber(input parameters, secret) -> serial number

不知道秘密的算法用户必须在没有秘密的情况下在经济有趣的时间跨度内猜出秘密或产生有用的序列号。

安全哈希函数旨在满足您的要求。

serialNumber(parameters, secret) = md5(parameters & secret)
verify(parameters, secret, serialNumber) = md5(parameters & secret) == serialNumber

根据您的安全要求,您需要一个全局密钥或多个上下文的多个密钥。

只有在同一位置执行序列号的创建和验证时,此解决方案才有效。 (否则必须使用公钥加密。)

【讨论】:

  • 您好,verify方法应该不能创建序列号,因为它很容易被客户读取(使用类文件的分解)
  • 我有一个客户端-服务器-方案。序列号在同一个地方创建和验证。如果您必须能够在不受信任的地方验证序列号,则必须使用公钥密码术。
【解决方案3】:

您所做的基本上是创建自定义hash function。哈希函数只允许在给定摘要匹配给定输入数据时回答。 IE。任何人都可以为数据创建摘要。

您真正想要的是digital signature。 IE。总体思路是:

  1. 创建私钥和公钥;
  2. 向任何客户端公开公钥;
  3. 为数据创建摘要并签名 它与私钥任何数据 应交付给客户;
  4. 客户端解密加密消息 用你的公钥消化, 计算消息摘要 给定数据并检查 计算的摘要与 已交付;

即如果客户端能够使用您的公钥对其进行解密,则客户端可以确定从服务器接收到的摘要是正确的。

【讨论】:

  • 问题是我无法修改根据输入生成串行代码的方法。 (我在问题中添加了一些额外信息:见上文)
【解决方案4】:

恐怕,你再怎么努力,总有人可以破解你的代码并创建密钥生成器或应用补丁来禁用对序列号的检查。

你只能让他们过日子:

  1. 为了生成您的序列号,请使用非对称算法,您可以使用私钥生成编号并使用公钥(在客户端)对其进行验证。我见过一些解决方案,其中许可证文件在供应商处进行了数字签名,应用程序只是检查文件是否存在并且签名正确。
  2. 混淆您的代码。这不会阻止反编译,但也许很多黑客认为分析混淆代码不值得。

【讨论】:

    【解决方案5】:

    您可以使用digital signature 使其防弹。不必将用于创建序列号的代码推广给您的客户。

    在您的情况下,数据部分将是参数mentionend(我猜是用户名)。您可以将它们转换为字符串表示形式(字符串可以很容易地被散列)。签名是您提供给客户的序列号。

    在客户端代码中,可以仅使用给定参数和序列密钥本身来验证数字签名/序列密钥。当然,您必须创建一个公共和私人密钥。公钥必须包含在向客户推出的代码中。必须妥善保管私钥。

    有一些类可以帮助创建数字签名。 Look here for a tutorial.

    【讨论】:

    • 同上注释:串码方式已经定义,无法更改。此代码返回分发给用户的序列号。想象一下用户已经拥有一个序列号。
    【解决方案6】:

    鉴于您无法将串行代码生成更改为使用非对称加密,我会将验证移至 Web 服务。因此 methodICanInvent(serialcode, "someinput") 调用执行验证的 Web 服务并返回 true 或 false。

    这样做的原因是用户可以轻松地反编译您的验证代码,该代码可用于为密钥生成器收集信息。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-09-19
      • 1970-01-01
      • 2014-07-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多