我有一个创建序列号的应用程序,如下所示:
Take customername
Sign customername using privatekey and sha/dsa algorithm
然后可以通过使用公钥解码来检查许可证,并检查客户名称匹配
除了生成的序列相当长之外,这可以正常工作。因此,客户输入序列号实际上并不实用,而是必须在文件中提供序列号,这与雾应用程序的工作方式有很大不同,而且令人困惑。
许多其他应用程序只是在用户购买时为他们提供一个 Guid
即5bd1060b-8608-4817-93ca-207f7c828e2f
用户必须输入他们的电子邮件地址和 guid 才能许可他们的应用程序。
对于用户来说,这看起来像是一个更简洁的解决方案,但我不明白这样的应用程序如何从无效的 guid 中验证有效的 guid,除非它通过检查数据库上的电子邮件地址/guid 对在线完成。但我真的希望在不需要在线检查的情况下进行某种验证:
a>如果互联网连接/我的服务器关闭,应用程序将无法运行,或者 b>他们可以通过禁用互联网访问来规避检查
编辑:
我的理解解决方案由以下答案提出:
用户进行购买
Take emailaddress + salt
用 SHA1 加密给出 160 位哈希
转换为十六进制表示法给出 20 个十六进制值,即
最后 8 个字符的 40 个字符 Lop 给出一个 Guid
电子邮件用户 Gui 和他们输入程序的电子邮件地址 程序通过以下方式验证此配对获取电子邮件地址、添加盐、加密 ectera 并检查会生成有效的 guid。
我的主要问题是我需要将盐存储在程序中的某个地方,因此如果黑客找到了盐并弄清楚我在做什么,他们可以为任何电子邮件地址创建一个有效的许可证密钥生成器。
我目前对另一个程序的方法:
我已经生成了一个公钥/私钥对
用户进行购买
我通过签署
电子邮件地址生成许可证 BaseEncode 生成的许可证 将许可证
发送给用户
程序通过使用公钥和解密来验证许可证
我的问题是,当我签署电子邮件地址时太长,所以我最终将它放在一个文件中,而不是用户将它输入到一个字段中,但问题可能是我是 base64 编码而不是转换为十六进制。
签名的输出可以多长时间,它取决于输入的长度还是总是相同的?
因为我用公钥解密了密钥,所以我无法删除许可证密钥的一些字符,但如果生成密钥只有 40 个字符,我想那没关系
我认为这种方法的优点是,即使黑客知道我是如何做事的,他们也无法创建许可证生成器,因为他们没有,也无法获取私钥,因为它只存储在我的服务器上。他们只能在创建新的私钥/公钥配对时生成许可证,然后如果我的应用程序本身具有编码的公钥,则应用程序无论如何都可以拒绝许可证。
当然,他们可以破解应用程序,但如果应用程序定期更新,这将变得很费力。
总而言之: 我是否正确理解了这一点,哪种方法最好,以及为第二种方法生成了多少数据。