You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

开发API时如何生成类似News API的随机API密钥?

嘿,刚好做过类似的需求!生成像News API那种的API密钥,核心是要兼顾安全性实用性——既要难被暴力破解,又得方便开发者复制使用。下面我分享几个靠谱的实现思路和代码示例:

生成安全API密钥的核心原则

在动手之前,先明确几个关键要求:

  • 足够长度:至少32位字符,越长越难被暴力破解(很多平台会用到64位)
  • 密码学安全的随机性:一定要用专门的安全随机数生成器,别用普通的Math.random()或者简单的随机函数,这些很容易被预测
  • 友好的字符集:优先选择大小写字母+数字,再搭配少量无歧义的特殊符号(比如-_),避开容易混淆的字符(比如0和O,1和l)
常见语言的实现示例

下面是几种主流开发语言的具体实现,都是用了密码学安全的工具:

Python

Python 3.6+ 自带的secrets模块专门用于生成安全随机数,比random模块可靠得多:

import secrets
import string

def generate_api_key(length=32):
    # 定义无歧义的安全字符集
    valid_chars = string.ascii_letters + string.digits + '-_'
    # 随机选择字符拼接成密钥
    return ''.join(secrets.choice(valid_chars) for _ in range(length))

# 生成一个32位的API密钥
print(generate_api_key())

Node.js(JavaScript)

用Node.js内置的crypto模块生成安全随机字节,再转成URL友好的Base64格式:

const crypto = require('crypto');

function generateApiKey(length = 32) {
    // 生成足够的随机字节,转Base64后替换特殊字符,再截取指定长度
    return crypto.randomBytes(Math.ceil(length * 3 / 4))
        .toString('base64')
        .replace(/\+/g, '-')
        .replace(/\//g, '_')
        .slice(0, length);
}

console.log(generateApiKey());

Java

SecureRandom生成安全随机字节,再用URL安全的Base64编码:

import java.security.SecureRandom;
import java.util.Base64;

public class ApiKeyGenerator {
    public static String generateApiKey(int length) {
        SecureRandom secureRandom = new SecureRandom();
        byte[] randomBytes = new byte[length];
        secureRandom.nextBytes(randomBytes);
        // 转成URL友好的Base64,去掉末尾的padding
        return Base64.getUrlEncoder().withoutPadding().encodeToString(randomBytes)
                .substring(0, length);
    }

    public static void main(String[] args) {
        System.out.println(generateApiKey(32));
    }
}
额外注意事项

生成密钥只是第一步,这些细节也不能忽略:

  • 永远不要把API密钥硬编码到代码里,用环境变量或者加密的配置文件管理
  • 数据库存储密钥时,一定要加密保存,别明文存储
  • 可以给密钥加个前缀(比如NEWS-xxxxxx),方便区分不同类型的API密钥
  • 定期轮换密钥,如果怀疑密钥泄露要立刻作废并生成新的

内容的提问来源于stack exchange,提问作者zayeedBS

火山引擎 最新活动