Java 检查串行代码的正确性

Java 检查串行代码的正确性,java,security,Java,Security,我在java中有一个方法,它根据一些参数生成一个串行代码 现在我想有另一个方法,它接受相同的参数+串行代码,并告诉我这个串行代码是否正确。但是,我不想公开串行代码创建方法,因此如果有人知道检查正确性的方法,他就不能基于其他一些参数构造新代码 这可能吗 一些额外的重要信息。我无法更改生成串行代码的方法。否则我可以使用一些标准的公钥-私钥算法。我想要的是: methodICannotChange("someinput") returns serialcode methodICanInvent(ser

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

现在我想有另一个方法,它接受相同的参数+串行代码,并告诉我这个串行代码是否正确。但是,我不想公开串行代码创建方法,因此如果有人知道检查正确性的方法,他就不能基于其他一些参数构造新代码

这可能吗

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

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

在这种情况下,如果知道methodICanInvent的实现,就“不可能”生成新的串行代码。

为什么不创建一个
serialcode
对象?将参数传递到构造函数中。如果参数有效,则会实例化
SerialCode
对象。如果不是,则构造函数失败

这样,所有
SerialCode
对象都表示有效的串行代码。您的客户机只需拥有一个实例化的
SerialCode
对象即可断言有效性


您可能希望提供一个
SerialCodeFactory
来创建这些对象(请参阅以获取有关工厂/工厂方法的信息),并且不向您的客户端公开这些对象,而只向SerialCode对象公开这些对象(通过包作用域或其他方式)。

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

它应该只依赖于一个锁着钥匙的秘密

serialNumber(input parameters, secret) -> serial number
不知道秘密的算法用户在没有秘密的情况下,无法在经济有趣的时间跨度内猜出秘密或生成有用的序列号

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

serialNumber(parameters, secret) = md5(parameters & secret)
verify(parameters, secret, serialNumber) = md5(parameters & secret) == serialNumber
根据您的安全要求,您需要一个全局机密或多个上下文的多个机密


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

您所做的基本上是创建自定义。哈希函数只允许在给定摘要与给定输入数据匹配时进行应答。即,任何人都可以为数据创建摘要

您真正想要的是一个。即,总体思路是执行以下操作:

  • 创建私钥和公钥
  • 向任何客户端公开公钥
  • 为数据创建摘要并签名 它使用私钥保存任何数据 应交付给客户
  • 客户端解密加密的消息 使用公钥进行摘要, 计算邮件的邮件摘要 提供数据并检查 计算摘要与 交付

  • 也就是说,如果客户能够使用您的公钥对其进行解密,那么他/她可能会确保从服务器接收到的摘要是正确的。

    恐怕,您尝试得越努力,总会有人入侵您的代码,创建密钥生成器或应用补丁来禁用序列号检查

    你只能让他们的生活变得艰难:

  • 对于序列号的生成,请使用非对称算法,使用私钥生成序列号,并使用公钥(在客户端)对其进行验证。我见过一些解决方案,其中许可证文件在供应商处进行数字签名,应用程序只需检查该文件是否存在并正确签名
  • 混淆你的代码。这不会阻止反编译,但可能很多黑客认为分析混淆的代码是不值得的
  • 您可以使用它使其防弹。创建串行代码的代码不必向您的客户推出

    在您的例子中,数据部分将是参数(我猜是用户名)。您可以将它们转换为字符串表示形式(字符串可以很容易地进行散列)。签名是您提供给客户的串行代码

    在客户端代码中,数字签名/序列密钥只能使用给定参数和序列密钥本身进行验证。当然,您必须创建公钥和prvate密钥。公钥必须包含在向客户推出的代码中。私钥必须保持安全


    有一些类可以帮助创建数字签名。

    如果不能将串行代码生成更改为使用非对称加密,我会将验证移到web服务。因此methodICanInvent(serialcode,“someinput”)调用执行验证的web服务并返回true或false


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

    我很抱歉,这并不能解决我的问题。我想防止有人能够通过反编译我的类文件轻松创建自己的串行代码。另请参见:谢谢。我认为第一个答案是这里可能非常有用,尽管这并不是我所希望的……在给定的约束条件下,这个问题基本上是无法解决的。假设串行代码生成算法可以生成任何长度为12个字符、可打印ASCII的代码,ASCII值之和为256的倍数。任何检查代码都将拒绝valid代码,接受无效代码,或显示您的算法。问题是我无法修改根据输入生成串行代码的方法。(我在问题中添加了一些额外信息:见上文)与上面的注释相同:serial code方法已定义,我无法更改它。此代码返回分发给用户的串行代码。假设用户已经有一个串行代码。您好,verify方法应该无法创建序列号,因为它可以