验证和许可我的加载项程序
Authenticating & Licensing my Add-in program
我已经为我想根据每年的订阅向客户销售的商业程序创建了一个插件。我一直在努力思考什么是安全方便地验证我的插件的最佳方法,但没有成功。
要求
- 轻松为客户端设置新许可证,无需更改代码
- 远程更新许可证
- 客户不是黑客,但应该不容易破解
环境
- 业务程序在服务器上运行,所有用户都单击一次 c# 客户端。插件位于客户端中。
- 我可以从客户端读取全局变量,例如站点名称,它对于每个实例都是唯一的,并且不能由客户编辑,还有日期(所以客户不会担心更改他们的日期设置)
- 我可以与我自己的服务器通信,我可以在其中存储许可结束日期
担忧
- 如果我使用我的服务器进行日常身份验证但无法访问,或者他们阻止了 IP...
- 当我从客户端向我的服务器请求结束日期时,这可能会被更改,但是如何在两个系统之间有效地加密它,而不需要整个私有/public 密钥设置?
我知道这是一个宽泛的问题,但我还需要就此涉及的不同方面给出宽泛的答案。有人可以指导我什么是好的设置,或者指导我到一个描述这个的网站吗?人们会认为这是非常典型的。我找不到任何东西。
多个 attempts/offline 工作的问题可以解决,例如通过为插件的请求颁发一个在有限时间(比如 1 周)内有效的令牌("temporary" 密钥)。所以用户得到 1 周的 "grace period",当他可以工作时 "offline"。如果在此期间内插件将无法连接到 Internet 以获取更新的令牌,那么它会阻止自己直到获得新令牌。示例 - Office 365,"grace period" 为 1 个月。
即如果可能,插件会向许可证服务器发送一个包含一些唯一用户 ID 的请求(例如您提到的应用程序 url,或者任何唯一标识您的客户端的内容),服务器搜索您的许可证数据库并发回一个(加密的)令牌包含许可证结束日期和所需的令牌刷新日期(当前服务器日期 + 1 周)
要加密,我认为您应该选择 "private/public key setup".. 为什么要避免这种情况 - 这似乎非常合理,并且在 .NET 中实施起来并不难。 IE。使用 private/public 密钥你至少可以确保没有人能够 "emulate" 你的服务器,只要你在你的许可服务器上保密你的私钥。
此外,请注意可能没有人会破解加密通信,因为破解插件本身要容易得多(它是 .NET 代码,对吗?)。我认为这个问题可能不会得到解决,而且可能是最大的问题。 IE。恶意用户只需删除插件代码中的许可证检查即可,仅此而已。但无论如何,这假设用户至少有一些破解程序代码的经验。
再考虑一下 - 如果您不打算自己销售插件(例如,处理客户订单、信用卡、进行欺诈检查等),您最好选择一些 "eCommerce" 专门从事在线销售软件的合作伙伴公司,如 paypro、avangate、bluesnap、2checkout 等。它可能已经有许多预定义(固定)许可供您选择。
我已经为我想根据每年的订阅向客户销售的商业程序创建了一个插件。我一直在努力思考什么是安全方便地验证我的插件的最佳方法,但没有成功。
要求
- 轻松为客户端设置新许可证,无需更改代码
- 远程更新许可证
- 客户不是黑客,但应该不容易破解
环境
- 业务程序在服务器上运行,所有用户都单击一次 c# 客户端。插件位于客户端中。
- 我可以从客户端读取全局变量,例如站点名称,它对于每个实例都是唯一的,并且不能由客户编辑,还有日期(所以客户不会担心更改他们的日期设置)
- 我可以与我自己的服务器通信,我可以在其中存储许可结束日期
担忧
- 如果我使用我的服务器进行日常身份验证但无法访问,或者他们阻止了 IP...
- 当我从客户端向我的服务器请求结束日期时,这可能会被更改,但是如何在两个系统之间有效地加密它,而不需要整个私有/public 密钥设置?
我知道这是一个宽泛的问题,但我还需要就此涉及的不同方面给出宽泛的答案。有人可以指导我什么是好的设置,或者指导我到一个描述这个的网站吗?人们会认为这是非常典型的。我找不到任何东西。
多个 attempts/offline 工作的问题可以解决,例如通过为插件的请求颁发一个在有限时间(比如 1 周)内有效的令牌("temporary" 密钥)。所以用户得到 1 周的 "grace period",当他可以工作时 "offline"。如果在此期间内插件将无法连接到 Internet 以获取更新的令牌,那么它会阻止自己直到获得新令牌。示例 - Office 365,"grace period" 为 1 个月。
即如果可能,插件会向许可证服务器发送一个包含一些唯一用户 ID 的请求(例如您提到的应用程序 url,或者任何唯一标识您的客户端的内容),服务器搜索您的许可证数据库并发回一个(加密的)令牌包含许可证结束日期和所需的令牌刷新日期(当前服务器日期 + 1 周)
要加密,我认为您应该选择 "private/public key setup".. 为什么要避免这种情况 - 这似乎非常合理,并且在 .NET 中实施起来并不难。 IE。使用 private/public 密钥你至少可以确保没有人能够 "emulate" 你的服务器,只要你在你的许可服务器上保密你的私钥。
此外,请注意可能没有人会破解加密通信,因为破解插件本身要容易得多(它是 .NET 代码,对吗?)。我认为这个问题可能不会得到解决,而且可能是最大的问题。 IE。恶意用户只需删除插件代码中的许可证检查即可,仅此而已。但无论如何,这假设用户至少有一些破解程序代码的经验。
再考虑一下 - 如果您不打算自己销售插件(例如,处理客户订单、信用卡、进行欺诈检查等),您最好选择一些 "eCommerce" 专门从事在线销售软件的合作伙伴公司,如 paypro、avangate、bluesnap、2checkout 等。它可能已经有许多预定义(固定)许可供您选择。