真正有效的api密钥隐藏是让密钥不出现于可交付产物中,也不参与运行时明文传递:前端通过构建时静态替换(vue/react需加前缀)、后端用.env+dotenv运行时加载、java用jasypt加密存储+启动解密,且密钥绝不进git、不进前端、不进日志。
直接把 api 密钥写死在代码或配置文件里,等于把家门钥匙焊在防盗门上——看着结实,实则毫无防护。真正有效的隐藏,不是“藏起来”,而是让密钥**不出现于可交付产物中**,也不参与运行时明文传递。核心思路就一条:变量替换必须发生在构建或启动阶段,且密钥本身绝不落地到前端资源或源码仓库。
前端项目:构建时静态替换(Vue/React)
浏览器环境无法读取系统级环境变量,所以必须靠构建工具在编译时把变量值“塞进” JS 文件。这个过程是单向的、不可逆的,生成的代码里只有值,没有变量名,也没有读取逻辑。
- 在项目根目录创建 .env.production(生产环境)或 .env.development(开发环境),内容必须以特定前缀开头:
Vue 项目写 VUE_APP_API_KEY=sk_live_xxx;
React 项目写 REACT_APP_API_KEY=sk_live_xxx。 - 确保 .gitignore 中已包含 .env*,防止文件被提交。
- 构建完成后(如 npm run build),密钥已作为字符串常量嵌入打包后的 JS,但不会出现在源码中,也不会通过 process.env 在浏览器控制台动态暴露。
后端 Node.js:运行时加载 .env + dotenv
服务端可以安全读取环境变量,关键在于不让 .env 文件进入版本库,也不在代码里拼接字符串。
- 项目根目录新建 .env,写入 API_KEY=sk_live_xxx。
- 在 .gitignore 中明确添加 .env。
- 入口文件(如 index.js)顶部第一行写 require('dotenv').config();,之后所有地方用 process.env.API_KEY 获取——代码里始终只有变量名,没有密钥本体。
Java/Spring Boot:加密存储 + 启动时解密
配置文件(如 application.yml)虽在服务端,但若明文存放仍可能被运维、日志或备份泄露。jasypt 提供的是“密文存储 + 自动解密”模式。
- 引入依赖 jasypt-spring-boot-starter。
- 用 Jasypt 工具将明文密码(如 root123)加密成一长串密文,例如 ENC(8aBcDeFgHiJkLmNoPqRsTuVwXyZ1234567890...)。
- 把密文填入配置文件:spring.datasource.password: ENC(8aBcDeFg...),同时通过 JVM 参数或环境变量传入解密口令:-Djasypt.encryptor.password=mySecretKey。
- 应用启动时自动解密,业务代码照常使用 password 字段,完全无感。
通用原则:密钥永远不进代码、不进仓库、不进前端
无论用哪种技术,守住三条底线:
- 密钥值本身不出现在任何提交到 Git 的文件中(包括 .env、.ini、.yml、JS/TS 源码);
- 前端项目中,密钥不能出现在浏览器可访问的任何请求头、响应体或 console 输出里;
- 后端项目中,避免日志打印完整密钥(需配合日志脱敏规则,如匹配 sk-.* 并替换为 sk-****)。
大量免费API接口:立即使用
涵盖生活服务API、金融科技API、企业工商API、等相关的API接口服务。免费API接口可安全、合规地连接上下游,为数据API应用能力赋能!











