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

使用auto-py-to-exe打包Python脚本时隐藏GOOGLE_CREDENTIALS JSON文件

隐藏GCP服务账号JSON文件的可行方案

方案1:将JSON凭证直接嵌入代码

把服务账号JSON的内容以字符串形式硬编码到代码中,完全无需依赖外部文件。示例代码:

import json
from google.oauth2 import service_account

# 把你的服务账号JSON内容复制到这里,用三引号包裹
CREDENTIALS_JSON = '''
{
  "type": "service_account",
  "project_id": "your-project-id",
  "private_key_id": "your-key-id",
  // 其他JSON字段...
}
'''

# 从字符串加载凭证
credentials = service_account.Credentials.from_service_account_info(json.loads(CREDENTIALS_JSON))

打包后的exe不再需要外部JSON文件,彻底避免文件暴露问题。注意:如果exe被反编译,凭证存在泄露风险,高敏感场景建议结合加密处理。

方案2:将JSON文件打包进exe资源

利用auto-py-to-exe(基于PyInstaller)的资源打包功能,把JSON文件嵌入exe内部,运行时从临时目录读取:

  1. 在auto-py-to-exe界面的Additional Files区域,添加你的JSON文件,设置"Destination"为.(或任意内部路径);
  2. 代码中通过sys._MEIPASS获取打包后的临时资源目录,动态读取文件:
import sys
import os
from google.oauth2 import service_account

def load_gcp_credentials():
    # 判断是否为打包后的运行环境
    if getattr(sys, 'frozen', False):
        # 打包后,资源文件会被解压到sys._MEIPASS指向的临时目录
        json_path = os.path.join(sys._MEIPASS, 'your-credentials.json')
    else:
        # 开发环境下的文件路径
        json_path = os.path.join(os.path.dirname(__file__), 'your-credentials.json')
    
    return service_account.Credentials.from_service_account_file(json_path)

运行exe时,JSON文件会被临时解压到系统临时目录,程序退出后该目录会被自动清理,用户不会在输出文件夹看到JSON文件。

方案3:加密JSON内容(增强安全性)

如果担心凭证泄露,可先对JSON内容加密,再将加密后的内容嵌入代码或打包到exe中,运行时解密加载:

  1. 离线生成加密密钥并加密JSON内容(示例使用cryptography库):
from cryptography.fernet import Fernet

# 生成密钥(仅需执行一次,保存好密钥)
key = Fernet.generate_key()
cipher = Fernet(key)

# 读取并加密JSON文件
with open('your-credentials.json', 'rb') as f:
    encrypted_data = cipher.encrypt(f.read())

# 将加密后的内容保存为字符串或文件
with open('encrypted_credentials.txt', 'wb') as f:
    f.write(encrypted_data)
  1. 代码中嵌入密钥和加密后的内容,运行时解密:
from cryptography.fernet import Fernet
from google.oauth2 import service_account
import json

# 嵌入密钥和加密后的凭证数据
ENCRYPTED_KEY = b'your-generated-key'
ENCRYPTED_CREDENTIALS = b'your-encrypted-data'

cipher = Fernet(ENCRYPTED_KEY)
decrypted_json = cipher.decrypt(ENCRYPTED_CREDENTIALS)
credentials = service_account.Credentials.from_service_account_info(json.loads(decrypted_json))

注意:密钥需妥善处理,避免硬编码的密钥被反编译获取,可考虑结合用户输入密钥、系统环境变量等方式存储密钥。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 11:45:32