You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

API密钥存储应选何种哈希算法?附数据库查询最佳实践

问题解答

2023年推荐的强哈希算法

当前最先进且被行业广泛认可的哈希算法是Argon2id——它是2015年密码哈希竞赛(Password Hashing Competition)的获胜者,在抗GPU/ASIC暴力攻击、内存消耗控制、并行计算抗性等维度表现最优,完全适配2023年及后续的安全需求,是存储API密钥这类敏感凭证的首选强哈希方案。

哈希API密钥用于数据库查询的最佳实践

绝对不能使用无盐哈希(包括无盐Argon2id),这会直接暴露在彩虹表攻击下,严重降低密钥安全性。正确的解决方案是采用双哈希策略,同时兼顾查询效率和存储安全:

具体实现步骤

1. 发放API密钥时的存储逻辑

  • 生成足够长度的随机API密钥(建议32位以上随机字符,避免碰撞风险)
  • 计算快速索引哈希:使用SHA-256(或SHA-1,SHA-256安全性更高)搭配服务器端专属的全局固定盐(仅保存在配置文件/环境变量,不存入数据库),得到api_key_index字段存入数据库
  • 使用Argon2id+随机盐哈希原始API密钥,得到api_key_hash字段存入数据库
  • 将原始API密钥一次性发送给用户(用户需自行保存,服务器不再留存原始密钥)

伪代码示例:

import hashlib
import argon2

# 全局固定盐(服务器端配置,不存数据库)
GLOBAL_SALT = b"your-server-global-salt-here"
# 生成随机API密钥
raw_api_key = generate_random_32_char_string()

# 计算索引哈希
index_hash = hashlib.sha256(GLOBAL_SALT + raw_api_key.encode()).hexdigest()
# 计算强验证哈希
argon2_hasher = argon2.PasswordHasher()
strong_hash = argon2_hasher.hash(raw_api_key)

# 存入数据库
db.execute("INSERT INTO users (api_key_index, api_key_hash) VALUES (?, ?)", (index_hash, strong_hash))

2. 处理API调用时的验证逻辑

  • 从请求头(或其他安全渠道)获取用户传入的API密钥
  • 计算相同规则的快速索引哈希(全局盐+传入密钥)
  • 通过索引哈希查询数据库,匹配对应的用户记录
  • 取出记录中的api_key_hash,用Argon2id验证传入密钥是否匹配
  • 验证通过则允许访问,否则直接拒绝

伪代码示例:

# 获取用户传入的API密钥
received_api_key = request.headers.get("X-API-Key")

# 计算索引哈希
index_hash = hashlib.sha256(GLOBAL_SALT + received_api_key.encode()).hexdigest()
# 查询数据库
user = db.execute("SELECT * FROM users WHERE api_key_index = ?", (index_hash,)).fetchone()

if user:
    # 验证强哈希
    try:
        argon2_hasher = argon2.PasswordHasher()
        argon2_hasher.verify(user["api_key_hash"], received_api_key)
        # 验证通过,处理请求
        return handle_request()
    except argon2.exceptions.VerifyMismatchError:
        # 密钥不匹配,拒绝
        return unauthorized()
else:
    # 无对应记录,拒绝
    return unauthorized()

方案优势

  • 快速索引哈希解决了查询问题:固定全局盐保证相同密钥生成的哈希一致,可直接用于数据库精准查询
  • Argon2id强哈希保障安全性:即使数据库泄露,攻击者拿到的是带随机盐的强哈希,无法快速破解出原始API密钥
  • 全局盐避免索引哈希被破解:即使攻击者获取api_key_index,没有全局盐也无法反向推导密钥特征

其他可选方案(非首选)

  • 前缀索引:截取API密钥前N位(如8位)哈希后作为索引,再用强哈希验证完整密钥。但存在碰撞风险,安全性弱于双哈希策略
  • UUID关联:发放API密钥时生成对应UUID作为查询标识,关联存储UUID与强哈希密钥。但需要用户同时传递UUID和API密钥,增加调用复杂度

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.23 00:13:19