2

我正在构建一个使用密钥与 REST API 通信(通过 https)的应用程序。我不希望用户/黑客发现该密钥并构建他自己的应用程序,该应用程序可能会向服务器发送虚假数据。保护应用程序内部的“字符串”的最佳选择是什么?

以下是我正在考虑的选项:

1) 在应用程序中对该字符串进行硬编码并混淆程序集。我认为仍然有一些反混淆方法可以解密这个。

2) 将其传递到 app.config 并在安装时使用内置的 .NET 机制进行加密。据我了解,解密密钥存储在 Windows 内的某个位置,用户看不到。必须有人具有良好的系统知识和黑客技能才能检索它,是吗?如果是的话,那么用户下载安装包的时候还是可以解压看到秘钥的吧?

我还有其他选择吗?

我知道没有办法保护客户端机器上的任何东西——没有 100% 的安全方法。

巴特克

4

3 回答 3

2

您有一个攻击者无法触及的秘密:用户密码。你能做的最好的就是

  • 使您的 REST 密钥难以重播(不使用它)
  • 使调用可追溯到单个用户的会话

以下是您可以模仿浏览器如何验证用户的方法。OAuth2 客户端 Web 应用程序流程是另一个示例。

  1. 询问用户密码
  2. 对用户进行身份验证,可能使用您要保护的相同 REST API。根据定义,这不是经过身份验证的调用。想想一个登录表单,它始终是公开的,在 HTTPS 连接上。
  3. 在服务器端,生成一个随机数,调用nonce并保存。
  4. 用户仍在等待他的登录,向他发送nonce. 那将是他自己的 REST密码

现在,当您的用户单击需要进行 REST 调用的富客户端中的某个位置时

  1. 将用户名-随机数对添加到您的 REST 调用中
  2. 在服务器上,当 REST 调用进来时,检查 username-nonce 是否有效
  3. 在您的 API 上调用某种注销,nonce如果不使用,则在一段时间后过期。

随机数本身应该很难猜到,GUID 不行。GUID 的 SHA-1(或更好)很好。

这很麻烦?没错,但这是你唯一的希望。您的服务器架构和客户端库可能已经支持一些您可以重用的身份验证方案,例如 HTTP BASIC 身份验证。

于 2013-01-29T19:50:28.967 回答
1

单个密钥的问题是,一旦密钥出来,您就无法真正信任任何数据。

来自设备的任何形式的凭据都可能被黑客入侵。

因此,至少我将拥有来自每台设备的唯一凭据。
这样,如果您怀疑数据不正确,您可以关闭这些凭据并查看与这些凭据关联的任何数据。

凭证可以是用户/密码、证书,甚至是密钥。
您能否设置应用程序以请求证书。

于 2013-01-29T15:58:37.927 回答
1

不要将机密存储在客户端上。将其存储并在服务器上使用。

如果您将秘密发送给客户端,请确保您: - 在传输过程中以及存储在磁盘或内存中时对其进行加密 - 给它一个(短)生命周期,因此当它被解密或发现时它将不再有效。

你是对的:当有人在系统上是管理员时,你不能相信系统可以保证某些东西的安全。

如果用户不是管理员,您可以使用证书存储或文件系统的其他特殊部分,只有系统和管理员可以访问。

于 2013-01-29T14:24:26.483 回答