如何生成API密钥和密钥对以保护API安全

作者:API传播员 · 2026-01-01 · 阅读时间:4分钟

在API 密钥和密钥对的生成与管理是确保 API 安全性的关键步骤。本文将为您提供关于如何生成 API 密钥和密钥对的实用指南,帮助您在开发和使用 API 时更好地保护数据安全。


什么是 API 密钥或客户端 ID?

API 密钥(或客户端 ID)是一种用于标识用户的唯一密钥,类似于用户名或电子邮件地址。它的主要特点是:

  • 唯一性:每个用户的密钥必须是唯一的。
  • 不可预测性:密钥的生成应避免任何模式或规律,以防止被恶意猜测。
  • 无需加密存储:API 密钥本身不需要加密存储。

在 Node.js 中,我们可以使用内置的 crypto 模块来生成 API 密钥。以下是一个简单的代码示例

const crypto = require('crypto');

function generateApiKey() {
    return crypto.randomBytes(32).toString('base64');
}const apiKey = generateApiKey();
console.log('Generated API Key:', apiKey);

以上代码将生成一个随机的 32 字节 API 密钥,并以 Base64 格式输出。


什么是 API 机密或客户端机密?

API 机密(或客户端机密)是一种用于保护 API 安全访问的密钥,与密码类似。它的主要特点包括:

  • 唯一性和不可预测性:与 API 密钥相同,机密也必须是唯一且不可预测的。
  • 哈希存储:为了防止泄露,API 机密应以哈希形式存储在数据库中。
  • 作用域分离:为不同的 API 功能分配不同的密钥,例如一个密钥用于“创建”和“更新”操作,另一个密钥用于“读取”操作。

以下是生成随机密钥并对其进行哈希处理的代码示例:

const crypto = require('crypto');

// 生成随机密钥
function generateKey() {
    return crypto.randomBytes(32).toString('base64');
}// 使用 scryptSync 对密钥进行哈希处理
function generateSecretHash(key) {
    const salt = crypto.randomBytes(16).toString('hex');
    const hash = crypto.scryptSync(key, salt, 64).toString('hex');
    return ${hash}.${salt};
}// 示例用法
const key = generateKey(); // 生成的随机密钥
console.log('Generated Key:', key);const secretHash = generateSecretHash(key); // 生成的哈希密钥
console.log('Hashed Secret:', secretHash);

注意事项

  • 密钥存储:将生成的密钥发送给用户,并提醒其妥善保存。由于密钥的哈希值存储在数据库中,无法直接还原原始密钥。
  • 密钥验证:在需要验证密钥时,可以通过对用户提供的密钥重新进行哈希处理,并与数据库中存储的哈希值进行比较。

以下是验证密钥的代码示例:

function verifySecret(key, storedHash) {
    const [hash, salt] = storedHash.split('.');
    const newHash = crypto.scryptSync(key, salt, 64).toString('hex');
    return hash === newHash;
}

// 示例验证
const isValid = verifySecret(key, secretHash);
console.log('Is Valid Secret:', isValid);

总结

生成和管理 API 密钥与机密是确保 API 安全的基础。以下是一些关键点:

  1. 使用随机生成的唯一密钥来标识用户。
  2. 对 API 机密进行哈希处理,并以安全的方式存储。
  3. 根据 API 的不同功能分配不同的密钥,以实现作用域分离。
  4. 提醒用户妥善保存密钥,避免因遗失而导致无法访问 API。

通过遵循这些最佳实践,您可以有效地保护 API 的安全性,并为用户提供更可靠的服务。


原文链接: https://shahid.pro/blog/2021/09/22/how-to-generate-api-key-and-secret-to-protect-api/