使用JWT生成API密钥,并在需要时重新生成相同的密钥

时间:2019-08-03 10:31:21

标签: security jwt api-key

我最近发现自己需要为我的应用程序开发公共API。我使用node.jsmongodb开发了我的应用程序。经过研究,我决定使用jwt来生成用于用户和身份验证的API密钥。为了认证jwt令牌,它们的优点是无需将它们存储在数据库中,因为可以在不知道确切生成的令牌的情况下对它们进行解码和验证。

但是我看到很多应用程序在应用程序仪表板中向用户显示其API密钥,因此我需要实际存储令牌,以便以后将它们显示给用户。我知道存储令牌是一个坏主意,如果数据库遭到破坏,它可能会让黑客利用API密钥来冒充他人。

长话短说,我试图找到一种方法来不存储确切的令牌,而是仅将有效负载存储在数据库中,并且每次用户请求其API密钥时,我都会使用 SECRET生成相同的密钥并将其传递给他们。我目前发现,如果在签名令牌步骤中,每次都传递相同的有效载荷和相同的iat(在发出),则每次生成的令牌都将相同。因此,通过将iat与有效载荷数据保存在数据库中,我可以每次生成确切的令牌。

这是我的mongoose模式:

var KeySchema = new mongoose.Schema({
  name: { type: String, default: 'API Key' },
  active: { type: Boolean, default: true },
  iat: { type: Date, required: true },
  project: { type: mongoose.Schema.Types.ObjectId, ref: 'Project', required: true },
});

这就是我使用jsonwebtoken npm包生成相同令牌的方式:

import jwt from 'jsonwebtoken';

jwt.sign({ project, iat: CONST_TIMESTAMP }, config.secrets.session);

现在我的问题是:

  • 这种方法是好的方法还是有更好的方法来实现呢?
  • 在不存储API密钥的情况下是否有任何好的做法?
  • 这是否有必要(考虑是否有任何数据库,所有数据已经​​被盗)?
  • 除了使用jwt以外,还有其他方法吗?

1 个答案:

答案 0 :(得分:0)

JWT是用于给定目标的标准方法,对于您来说,我建议使用非对称签名密钥。

这样做的好处是,消费者或客户将需要信任发行者,并且可以通过多种方式分配密钥的公开部分。

因此,这消除了密钥重新生成的要求,您还可以使用标准技术来保护签名密钥的私有部分。