如何设计供应系统的识别机制?
How to design recognition mechanism of a provisioning system?
我正在构建一个配置系统,其他 software/app/device/user 将连接到它。我想要创建一个识别机制,以便我可以识别连接到系统的东西是有效身份。
某种密钥,特定于连接软件。要求是配置系统容易理解密钥,但其他系统难以破解。
我可以简单地创建一些随机字符(密钥)并在注册过程中将其提供给连接设备,它们稍后将通过这些字符连接到配置系统,然后会出现一些问题。一是身份窃取,任何人都可以窃取并连接到供应系统;另一个是有人可以恶作剧地分发密钥。对于这两种情况,系统都无法验证连接应用程序的合法性。
任何解决这种情况的建议都非常有用。
我10天前在programmers.stackexchange.com问过同样的问题,希望指定的论坛最适合这个话题,不幸的是我没有收到任何东西。我已经标记了要求版主将其移至 SO 的问题,但我的请求被拒绝了。
希望能在这里得到一些帮助。
技术栈
我最喜欢的实现语言是Java。连接协议是 SSL/TLS over HTTP。
所以,您想要一种不在您身边存储 API 密钥的身份验证机制?看看JSON Web Tokens,也许就是你需要的。
您的问题似乎技术比较抽象,因此很难找到 'correct' 答案。你应该考虑用更多的技术细节来问你的问题(你的服务器基于哪种技术(语言,服务器,......)。其他人如何连接(哪个协议,传输层等)。
但要根据您的水平给出答案,您应该查看非对称密钥(public/private 密钥对)。如果您担心密钥分发,您可以将此方法与硬件解决方案(加密狗、卡)结合使用,或者您可以首先计算硬件标识符(基于 MAC 地址、硬件序列号……)时间登录并将身份验证密钥绑定到那个(但这会导致支持工作,因为系统可以更改,用户可以购买新硬件,...)
身份分布
One is the identity theft, anyone can steal it and can connect to the
provisioning system; another one is that someone mischifely can
distribute the key. For both the cases the system would fail to verify
the legitimacy of the connecting app.
在大多数身份验证模式中,客户端负责保护自己的身份。当客户端知道身份验证协议并愿意共享所有允许其他客户端模拟的详细信息时 him/it 那么实际上就不可能保护和保证该客户端的身份。
如果您担心您的客户会分享他们的身份,那么您将不得不让第三方客户自己很难弄清楚他们实际上是如何获得身份验证的。我能想到的一种方法是,每个客户端都将被迫在他们的机器上安装专有软件,通过该软件进行身份验证。为了保持安全,该软件必须非常难以逆向工程,但即使这样也不是万无一失的。
我认为首先要做的是确定为什么您如此关心保证客户的身份以及为什么它会吸引他们分享他们的身份?
例如,即使不是全部,大多数 MMORG 游戏都会阻止玩家共享他们的帐户。他们这样做当然是为了获得更多的销售额,但另一个动机可能是防止一个帐户比真正的单人游戏帐户玩得更频繁,从而进步得更快。由于身份共享成为一种优势,他们不能仅仅依靠玩家来保护他们的身份安全,他们必须想出诸如 IP 地址检查、通过 ISP 进行地理定位、不寻常的游戏时间等策略,但所有这些额外的措施都可以克服。也许游戏设计师应该努力寻找玩家不参与身份验证过程的身份验证策略。
最后,在任何情况下,经常更改身份验证协议或详细信息肯定会使盗窃或自愿共享身份变得更加困难,但这并非没有代价。
认证动机?
您可能希望确保客户端身份的另一个原因是您必须能够信任他们发送的信息。在这种情况下,目标是完全不同的,而不是着眼于我们如何验证客户的身份,也许我们应该着眼于验证他们的输入的策略。输入验证策略将特定于您的域,有时需要架构更改。
我能想到的一个例子是 Blockchain 如何保证各种客户端之间的交易完整性。
有什么风险?
最后,在考虑针对您的问题的具体解决方案之前,您应该定义非法客户端使用您的配置系统的实际风险是什么。只有这样,您才能选择开明的解决方案。一个好的解决方案将在风险和复杂性之间取得平衡。
我正在构建一个配置系统,其他 software/app/device/user 将连接到它。我想要创建一个识别机制,以便我可以识别连接到系统的东西是有效身份。
某种密钥,特定于连接软件。要求是配置系统容易理解密钥,但其他系统难以破解。
我可以简单地创建一些随机字符(密钥)并在注册过程中将其提供给连接设备,它们稍后将通过这些字符连接到配置系统,然后会出现一些问题。一是身份窃取,任何人都可以窃取并连接到供应系统;另一个是有人可以恶作剧地分发密钥。对于这两种情况,系统都无法验证连接应用程序的合法性。
任何解决这种情况的建议都非常有用。
我10天前在programmers.stackexchange.com问过同样的问题,希望指定的论坛最适合这个话题,不幸的是我没有收到任何东西。我已经标记了要求版主将其移至 SO 的问题,但我的请求被拒绝了。
希望能在这里得到一些帮助。
技术栈
我最喜欢的实现语言是Java。连接协议是 SSL/TLS over HTTP。
所以,您想要一种不在您身边存储 API 密钥的身份验证机制?看看JSON Web Tokens,也许就是你需要的。
您的问题似乎技术比较抽象,因此很难找到 'correct' 答案。你应该考虑用更多的技术细节来问你的问题(你的服务器基于哪种技术(语言,服务器,......)。其他人如何连接(哪个协议,传输层等)。
但要根据您的水平给出答案,您应该查看非对称密钥(public/private 密钥对)。如果您担心密钥分发,您可以将此方法与硬件解决方案(加密狗、卡)结合使用,或者您可以首先计算硬件标识符(基于 MAC 地址、硬件序列号……)时间登录并将身份验证密钥绑定到那个(但这会导致支持工作,因为系统可以更改,用户可以购买新硬件,...)
身份分布
One is the identity theft, anyone can steal it and can connect to the provisioning system; another one is that someone mischifely can distribute the key. For both the cases the system would fail to verify the legitimacy of the connecting app.
在大多数身份验证模式中,客户端负责保护自己的身份。当客户端知道身份验证协议并愿意共享所有允许其他客户端模拟的详细信息时 him/it 那么实际上就不可能保护和保证该客户端的身份。
如果您担心您的客户会分享他们的身份,那么您将不得不让第三方客户自己很难弄清楚他们实际上是如何获得身份验证的。我能想到的一种方法是,每个客户端都将被迫在他们的机器上安装专有软件,通过该软件进行身份验证。为了保持安全,该软件必须非常难以逆向工程,但即使这样也不是万无一失的。
我认为首先要做的是确定为什么您如此关心保证客户的身份以及为什么它会吸引他们分享他们的身份?
例如,即使不是全部,大多数 MMORG 游戏都会阻止玩家共享他们的帐户。他们这样做当然是为了获得更多的销售额,但另一个动机可能是防止一个帐户比真正的单人游戏帐户玩得更频繁,从而进步得更快。由于身份共享成为一种优势,他们不能仅仅依靠玩家来保护他们的身份安全,他们必须想出诸如 IP 地址检查、通过 ISP 进行地理定位、不寻常的游戏时间等策略,但所有这些额外的措施都可以克服。也许游戏设计师应该努力寻找玩家不参与身份验证过程的身份验证策略。
最后,在任何情况下,经常更改身份验证协议或详细信息肯定会使盗窃或自愿共享身份变得更加困难,但这并非没有代价。
认证动机?
您可能希望确保客户端身份的另一个原因是您必须能够信任他们发送的信息。在这种情况下,目标是完全不同的,而不是着眼于我们如何验证客户的身份,也许我们应该着眼于验证他们的输入的策略。输入验证策略将特定于您的域,有时需要架构更改。
我能想到的一个例子是 Blockchain 如何保证各种客户端之间的交易完整性。
有什么风险?
最后,在考虑针对您的问题的具体解决方案之前,您应该定义非法客户端使用您的配置系统的实际风险是什么。只有这样,您才能选择开明的解决方案。一个好的解决方案将在风险和复杂性之间取得平衡。