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
相关产品推荐
相关产品推荐

