文章内容

2025/9/23 1:01:39,作 者: 黄兵

API SecretKey 为什么不能使用不可逆加密算法

最近在开发 API 的时候,了解到存放 secret_key 加密的一些相关知识,做个总结。

这里的 secret_key 不能使用 generate_password_hash 加密,关于 generate_password_hash 可以参考这篇文章:werkzeug.security 的 enerate_password_hash 介绍

主要是最后生成的是哈希值,哈希值不可逆,我们获取了 secret_id 之后,需要对存在数据库中的 secret_key 值进行解密,并比对,而哈希算法是不可逆的,导致无法比对。

也就是:认证逻辑里 签名计算必须用明文 SecretKey,而如果数据库里只存哈希,那服务端没法再拿明文生成签名来对比。

所以这里只能使用对称加密,这里采用的是 AES 对称加密算法。

下面是一个 AES 加密存储 SecretKey 的 Python 示例方案:

1️⃣ 安装依赖

建议用 cryptography 库:

pip install cryptography

2️⃣ 加密工具类

import base64
from cryptography.fernet import Fernet

class SecretKeyUtil:
    # 你可以在项目初始化时生成一次 KEY,并存到配置文件或环境变量
    # key = Fernet.generate_key()
    # print(key)  # 保存下来,不能丢
    FERNET_KEY = b"你的固定FernetKey"  # 建议存放到 .env 或 config 里
    fernet = Fernet(FERNET_KEY)

    @classmethod
    def encrypt(cls, secret_key_plain: str) -> str:
        """加密 SecretKey"""
        return cls.fernet.encrypt(secret_key_plain.encode()).decode()

    @classmethod
    def decrypt(cls, secret_key_encrypted: str) -> str:
        """解密 SecretKey"""
        return cls.fernet.decrypt(secret_key_encrypted.encode()).decode()

这样就可以实现对于 SecretKey 的加解密了。

分享到:

发表评论

评论列表