Java 检查串行代码的正确性
我在java中有一个方法,它根据一些参数生成一个串行代码 现在我想有另一个方法,它接受相同的参数+串行代码,并告诉我这个串行代码是否正确。但是,我不想公开串行代码创建方法,因此如果有人知道检查正确性的方法,他就不能基于其他一些参数构造新代码 这可能吗 一些额外的重要信息。我无法更改生成串行代码的方法。否则我可以使用一些标准的公钥-私钥算法。我想要的是:Java 检查串行代码的正确性,java,security,Java,Security,我在java中有一个方法,它根据一些参数生成一个串行代码 现在我想有另一个方法,它接受相同的参数+串行代码,并告诉我这个串行代码是否正确。但是,我不想公开串行代码创建方法,因此如果有人知道检查正确性的方法,他就不能基于其他一些参数构造新代码 这可能吗 一些额外的重要信息。我无法更改生成串行代码的方法。否则我可以使用一些标准的公钥-私钥算法。我想要的是: methodICannotChange("someinput") returns serialcode methodICanInvent(ser
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
根据您的安全要求,您需要一个全局机密或多个上下文的多个机密
只有在同一位置创建和验证序列号时,此解决方案才有效。(否则,必须使用公钥加密。)您所做的基本上是创建自定义。哈希函数只允许在给定摘要与给定输入数据匹配时进行应答。即,任何人都可以为数据创建摘要 您真正想要的是一个。即,总体思路是执行以下操作:
也就是说,如果客户能够使用您的公钥对其进行解密,那么他/她可能会确保从服务器接收到的摘要是正确的。恐怕,您尝试得越努力,总会有人入侵您的代码,创建密钥生成器或应用补丁来禁用序列号检查 你只能让他们的生活变得艰难:
有一些类可以帮助创建数字签名。如果不能将串行代码生成更改为使用非对称加密,我会将验证移到web服务。因此methodICanInvent(serialcode,“someinput”)调用执行验证的web服务并返回true或false
原因是,用户可以轻松地反编译您的验证代码,该代码可用于收集密钥生成器的信息。我很抱歉,这并不能解决我的问题。我想防止有人能够通过反编译我的类文件轻松创建自己的串行代码。另请参见:谢谢。我认为第一个答案是这里可能非常有用,尽管这并不是我所希望的……在给定的约束条件下,这个问题基本上是无法解决的。假设串行代码生成算法可以生成任何长度为12个字符、可打印ASCII的代码,ASCII值之和为256的倍数。任何检查代码都将拒绝valid代码,接受无效代码,或显示您的算法。问题是我无法修改根据输入生成串行代码的方法。(我在问题中添加了一些额外信息:见上文)与上面的注释相同:serial code方法已定义,我无法更改它。此代码返回分发给用户的串行代码。假设用户已经有一个串行代码。您好,verify方法应该无法创建序列号,因为它可以