如何在第一次生成服务器时与服务器共享移动应用程序的密钥?

use*_*937 5 api django rest hmac

所以我现在正在开发一个移动应用程序,它将向使用Django构建的REST API发出请求.

为了保护API,我计划使用私钥/公钥对身份验证系统.

我想到的工作流程是这样的:

  1. 用户使用Facebook登录
  2. 一旦用户签署应用程序,就会生成一个私钥
  3. 私钥在服务器和应用程序之间共享,以便服务器知道将该私钥映射到特定用户.
  4. 每次移动应用程序发出请求时,应用程序都会使用请求参数和私钥生成HMAC /签名.除了HMAC之外,应用程序还会发送发送它的用户的user_id(这将充当公钥).
  5. 当服务器收到请求时,它会生成自己的HMAC.它接受user_id并在表中查找私钥.使用私钥,它使用请求参数重新创建HMAC,并将其与移动应用程序发送的HMAC进行比较.如果服务器和移动设备具有匹配的HMAC,则它执行请求.

现在我的问题在于步骤3,其中私钥必须以某种方式在移动应用程序和服务器之间共享.如何安全地发送私钥?

Qua*_*ega 5

首先,我要问为什么应用程序的服务器部分需要知道私钥。如果只想对用户进行身份验证,则只需要公共密钥和用户ID,并且用户ID不能为iself作为公共密钥(您需要一种方法来找出要使用的公共密钥)。

例如,共享密钥的过程(您的第三步)可能类似于以下内容:

  1. 该应用程序生成一个公共-私人密钥对。
  2. 该应用程序将公钥发送到服务器,而不关心谁可以拦截它。
  3. 服务器存储该公钥,并将其与用户提供的ID关联。

也许整合到Facebook是使这一点变得不可能的部分。我不太了解Facebook是如何进入整个过程的。

使密钥传输更加安全的一件事是使用多个通道进行传输。

例如,您的应用程序可以发送使用REST API生成的私钥,但可以使用对称加密方案对其进行加密。对称加密密钥可以通过某种其他媒介(例如电子邮件)发送,也可以通过SMS发送,因为这是一个移动应用程序,甚至可以通过自动电话拨打注册用户提供的号码。密钥可以是生成实际对称加密密钥的随机密码,以确保它可以由用户输入。然后,要解锁该应用程序,用户需要在屏幕上键入此密码短语,然后将密钥解锁。

同样,这仅在很小的程度上提高了传输的安全性,尤其是考虑到以下事实:如果您可以拦截私钥的传输,则可能可以拦截包含密码短语的电子邮件。我认为,不将私钥发送到服务器不仅是最佳的,而且是必需的。