如何保护移动应用程序的 API(私钥)

信息安全 密钥管理 数据库 网络服务 密钥交换
2021-09-01 14:50:08

我正在构建一个只能供 iOS 应用程序访问的 Web 服务。将来我想扩展到移动网站,使我的服务也可用于其他移动操作系统。

现在,我通过 API 完成了所有工作。我的用户可以注册、搜索公司、从这些公司订购产品并跟踪他们的订单。它还没有激活,但它正在工作..

我面临一个主要问题:如何确保这一点?

在过去的几天里,我停止了编码,并且一直忙于在 Web、StackOverflow 和 Information Security 中搜索如何做到这一点。我发现亚马逊保护他们的 API 的方式对我来说是最好的解决方案。此处解释了 Amazon 保护其服务的方式我为我的服务做了一些调整:

  1. 用户注册并获取私有 API 密钥 + 公共(识别)密钥
  2. 用户输入凭据并点击“登录”。应用程序使用变量 + 私钥创建散列。应用程序向 API 发送变量 + 时间戳 + 哈希 + 公钥
  3. API 在数据库中查找公钥,找到属于该公钥的私钥(如果公钥有效)。然后,API 以与应用程序相同的方式创建哈希。如果哈希值相同,则执行请求(在本例中为登录)。

这种保护服务的方式对我来说很有意义,而且我可以编写大部分代码。但我有一个大问题,我找不到任何解决方案:

  • 创建帐户时,用户将获得一个公共和私有 API 密钥。公钥可以从服务器发送到用户设备,因为这不一定是秘密。由于私有 API 密钥永远无法通过网络发送,我究竟如何确保在用户设备上登录的帐户知道在服务器上创建的私有 API 密钥?

有谁知道如何解决这个问题??任何帮助将不胜感激!

2个回答

为什么您希望客户拥有自己的私钥?我试图了解您的方案应该如何工作,但对您要实现的目标有点困惑。

总的来说,这里有一些可能会有所帮助的评论:

  1. HTTPS 是您与客户端建立安全通信通道的方式。完成此操作后,您可以通过有线客户端 <-> 服务器安全地传输您想要的任何内容。这与您的银行所做的相同。

  2. 您链接到的文章没有说明 HTTPS,看起来他们打算仅通过 HTTP 发送。对于您不希望受到损害的任何内容(例如登录用户),您应该使用 HTTPS 而不是 HTTP。既然可以使用 HTTPS,为什么还要尝试构建自己的加密机制?对我来说,使用 HTTP 进行任何类型的身份验证听起来都是很糟糕的建议。

  3. 我不确定您的客户是否真的需要他们自己的公钥/私钥对。通常,它是保护您的应用程序通信并且具有带有私钥的证书的服务器。客户仍然会有用户名和密码,对吗?这是您的客户端的身份验证(不是证书),一旦您建立了安全的 HTTPS 通道,您就可以将用户/密码发送到服务器。在服务器端,您的应用程序将验证客户端登录凭据是否有效,并通过 cookie 或会话机制为客户端提供“我已经通过身份验证 30 分钟”的方式。显然,一旦客户端登录,通信需要继续通过 HTTPS 进行,否则您的身份验证令牌/会话可能会被盗。

最重要的是,如果您只是想保护客户端和服务器之间的通信,那么请使用 HTTPS,不要重新发明轮子。

是的,有一个解决方案。在客户端创建公钥和私钥。然后只需要将客户端的公钥从客户端传输到服务器。服务器有自己的公钥和私钥对,它只共享公钥。

您描述的方案不应该要求双方都有公钥和私钥的副本。您描述了一种对称通信方案,其中传入和传出服务器的数据使用相同的公钥-私钥对进行加密,并且双方都需要公钥和私钥。

解决方案是引入一些不对称性。客户端应该有服务器的公钥。服务器应该有客户端的公钥。他们每个人都应该有自己的私钥。如果您希望服务器可以为所有客户端使用相同的密钥,或者您可以为每个客户端生成新的服务器密钥。无论如何,不​​需要共享私钥。

祝您实施顺利。请发表评论,让我们知道它是否有效!