我在java中有一个方法,它根据许多参数生成一个串行代码。
现在我想要另一个接受相同参数+串行代码的方法,并告诉我这个串行代码是否正确。但是,我不想暴露串行代码创建方法,所以如果有人知道检查正确性的方法,他就不能基于其他一些参数构造新代码。
这可能吗?
一些额外的重要信息。我无法更改生成序列代码的方法。否则我可以使用一些标准的公钥 - 私钥算法。我想要的是:
methodICannotChange("someinput") returns serialcode
methodICanInvent(serialcode, "someinput") returns true or false
并且在知道methodICanInvent的实现时,“不可能”生成新的序列码。
答案 0 :(得分:3)
您正在做的基本上是创建自定义hash function。哈希函数只允许在给定输入数据的给定摘要匹配时回答。即任何人都可以为数据创建摘要。
你真正想要的是digital signature。即一般的想法是做以下事情:
即。客户可以确定从服务器收到的摘要是否正确,如果他或她能够使用您的公钥解密它。
答案 1 :(得分:2)
序列码的安全性不得取决于算法的知识(即具有未知算法)和“公共”输入参数。
它应该只依赖于锁定和密钥的秘密:
serialNumber(input parameters, secret) -> serial number
不知道秘密的算法的用户无法在没有秘密的情况下在经济有趣的时间跨度内猜测秘密或产生有用的序列号。
安全散列函数旨在满足您的要求。
serialNumber(parameters, secret) = md5(parameters & secret)
verify(parameters, secret, serialNumber) = md5(parameters & secret) == serialNumber
根据您的安全要求,您需要一个全局机密或多个上下文的多个机密。
此解决方案仅在序列号的创建和验证在同一位置执行时才有效。 (否则必须使用公钥加密。)
答案 2 :(得分:2)
您可以使用digital signature使其成为防弹。创建序列代码的代码不必向您的客户推出。
在您的情况下,数据部分将是提及的参数(我猜一个用户名)。您可以将这些转换为字符串表示形式(可以轻松地对字符串进行哈希处理)。签名是您提供给客户的序列号。
在客户端代码中,可以仅使用给定参数和串行密钥本身来验证数字签名/串行密钥。当然,你必须创建一个公钥和prvate密钥。公钥必须包含在向客户推出的代码中。私钥必须保持安全。
有些课程可以帮助创建数字签名。 Look here for a tutorial
答案 3 :(得分:0)
为什么没有SerialCode
个对象?将参数传递给构造函数。如果参数有效,则SerialCode
对象将实例化。如果没有,则构造函数失败。
这样,所有SerialCode
个对象都代表有效的序列号。您的客户端可以通过拥有实例化的SerialCode
对象来断言 的有效性。
您可能需要提供SerialCodeFactory
来创建这些对象(有关工厂/工厂方法的信息,请参阅here),不要将其公开给您的客户端,而只是将其暴露给您的SerialCode对象(通过包范围或其他方式)。
答案 4 :(得分:0)
我担心,你最努力的是,总有人可以破解你的代码并创建密钥生成器或应用补丁来禁用序列号的检查。
你只会让他们生活困难:
答案 5 :(得分:0)
鉴于您无法将串行代码生成更改为使用不对称加密,我会将验证移至Web服务。因此,methodICanInvent(serialcode,“someinput”)调用执行验证的Web服务并返回true或false。
原因是用户可以轻松地反编译您的验证码,该验证码可用于收集密钥生成器的信息。