寻求Python+libsodium加密Token并更新GitHub Secret的实现方案
解决GitHub Actions中加密Access Token并更新Secret的问题
问题场景
需要通过GitHub Actions自动刷新OAuth Access Token,并将新Token加密后更新到GitHub Secrets中,但缺少基于libsodium的Python加密实现,现有Node.js参考示例,需适配Python环境。
解决方案
1. Python加密脚本(secret_encryptor.py)
创建该脚本用于读取环境变量中的新Token和GitHub公钥,完成加密后输出Base64编码的加密结果:
import os import base64 from nacl import crypto def main(): # 从环境变量获取新Token和GitHub公钥 new_access_token = os.environ.get("NEW_ACCESS_TOKEN") github_public_key_base64 = os.environ.get("PUBLIC_KEY") if not new_access_token or not github_public_key_base64: raise ValueError("缺少必要的环境变量:NEW_ACCESS_TOKEN 或 PUBLIC_KEY") # 解码Base64格式的公钥 public_key_bytes = base64.b64decode(github_public_key_base64) public_key = crypto.public.PublicKey(public_key_bytes) # 使用SealedBox加密Token(符合GitHub要求的RSA-OAEP-SHA1标准) encrypted_token = crypto.public.SealedBox(public_key).encrypt(new_access_token.encode("utf-8")) # 将加密结果转为Base64字符串输出 print(base64.b64encode(encrypted_token).decode("utf-8")) if __name__ == "__main__": main()
2. Workflow配套说明
- 你的现有Workflow无需修改
encrypt_access_token步骤,脚本会自动读取已注入的NEW_ACCESS_TOKEN和PUBLIC_KEY环境变量 - 确认
GH_PAT权限:针对仓库Secret需repo权限,针对组织Secret需admin:org权限 - 确保自托管runner中已安装
jq工具(用于解析API返回的JSON数据)
加密逻辑说明
GitHub要求Secret加密采用RSA-OAEP-SHA1算法,pynacl库的SealedBox模块原生支持该标准,通过公钥加密后,只有GitHub对应的私钥才能解密,保证Token传输和存储的安全性。
内容的提问来源于stack exchange,提问作者user26400325
相关产品推荐
相关产品推荐

