Gitleaks与Trivy集成:构建容器镜像密钥泄露的CI/CD全链路防护
1. 项目概述为什么镜像里的密钥是“定时炸弹”在容器化部署成为主流的今天我们习惯于将应用及其依赖打包成一个Docker镜像然后像分发标准件一样部署到任何环境。这个过程看似优雅却隐藏着一个巨大的安全盲区开发过程中无意间泄露的敏感信息如API密钥、数据库密码、SSH私钥等很可能随着代码一起被打包进最终的镜像里。想象一下你把自家大门的钥匙复制了一份然后不小心把它塞进了准备捐出去的旧沙发里。这个“沙发”就是你的容器镜像一旦被发布到公共仓库或内部共享任何能访问它的人都能轻松拿到这把“钥匙”。这就是“Gitleaks与容器安全扫描Trivy集成检测镜像中的密钥”这个项目要解决的核心问题。Gitleaks是一个出色的工具它能在Git仓库中扫描并发现提交历史中的密钥泄露。但它的防护范围止步于代码仓库。一旦代码被构建成镜像Gitleaks就无能为力了。而Trivy作为一款全面的容器安全扫描工具能够深入镜像文件系统检测其中的漏洞和配置错误。本项目的目的就是将两者的能力结合构建一个从代码提交到镜像构建的完整密钥泄露防护链条。具体来说就是在CI/CD流水线中先用Gitleaks确保代码“干净”再用Trivy对构建出的镜像进行“终检”确保没有任何敏感信息被意外打包进去。这不仅是合规性要求更是保障业务安全的基础防线。2. 核心工具选型与集成逻辑解析2.1 为什么是Gitleaks Trivy面对密钥泄露问题市面上工具不少但Gitleaks和Trivy的组合有其独特的优势。Gitleaks的强项在于其精准性和对Git生态的原生支持。它内置了庞大且持续更新的正则表达式规则库能识别成千上万种不同服务如AWS、GitHub、Slack等的密钥格式。更重要的是它能扫描整个Git历史而不仅仅是当前工作目录。这意味着即使你在某个旧提交中泄露了密钥之后删除了文件Gitleaks依然能把它揪出来。它的工作模式是“静态代码分析”在代码层面就阻断风险成本最低。Trivy则是一个安全领域的“瑞士军刀”它不仅能扫描镜像中的操作系统软件包漏洞还能进行“文件系统扫描”。这正是我们需要的功能。当Trivy以trivy image --scanners secret命令运行时它会解压目标镜像的每一层文件系统并对其中的文件内容进行扫描寻找符合密钥模式的字符串。它的扫描引擎同样强大并且作为镜像扫描工具它能直接对接容器仓库和运行时环境。选择它们组合的原因很清晰分层防御覆盖全链路。Gitleaks守好代码入库的“第一道门”Trivy则把好镜像出厂的“最后一道关”。两者互补Gitleaks防止历史遗留问题Trivy防止构建过程中的意外引入比如复制了包含.env文件的目录。在CI/CD流水线中Gitleaks可以作为提交前钩子或合并请求检查Trivy则集成在镜像构建成功后的阶段。2.2 集成架构设计思路一个典型的集成架构如下图所示概念描述开发阶段开发者在本地提交代码前可运行Gitleaks进行自查。更关键的是在Git服务器如GitLab CI、GitHub Actions上配置预接收钩子或CI任务对每个推送Push或合并请求Pull Request自动运行gitleaks detect --source . -v。如果发现泄露则中断流程并报告。构建阶段代码通过检查后触发镜像构建Docker build。构建完成后并不立即推送至仓库而是先进行本地扫描。扫描阶段在CI Runner中对刚构建好的镜像标签运行trivy image --scanners secret --exit-code 1 --format table [你的镜像名:标签]。--exit-code 1参数是关键它表示一旦发现密钥泄露Trivy将以非零状态退出从而使CI任务失败阻止镜像被推送。报告与修复无论Gitleaks还是Trivy发现泄露都应提供清晰的报告指出泄露的密钥类型、所在文件、行号Gitleaks或镜像层Trivy。安全团队可以设置通知如将报告发送至Slack或生成JIRA工单督促开发者立即修复。这种设计将安全检查“左移”并自动化使其成为开发流程中不可或缺的一环而非事后补救措施。3. 实战部署一步步搭建自动化检测流水线下面我们以最流行的GitHub Actions为例展示如何构建一个从代码到镜像的完整密钥检测流水线。假设我们有一个简单的Node.js应用。3.1 第一步在GitHub仓库中配置Gitleaks ActionsGitleaks提供了官方的GitHub Action集成非常方便。在你的项目根目录下创建.github/workflows/gitleaks.yml文件。name: Gitleaks Secret Detection on: [push, pull_request] jobs: scan: runs-on: ubuntu-latest steps: - name: Checkout Code uses: actions/checkoutv4 with: fetch-depth: 0 # 必须设置为0以获取完整的Git历史记录供Gitleaks扫描 - name: Run Gitleaks uses: gitleaks/gitleaks-actionv2 env: GITLEAKS_CONFIG: https://raw.githubusercontent.com/gitleaks/gitleaks/master/config/gitleaks-config.toml # 使用官方默认配置你也可以使用自定义配置路径 GITLEAKS_LICENSE: ${{ secrets.GITLEAKS_LICENSE }} # 如果是企业版需要许可证 with: config-path: .gitleaks.toml # 可选如果你想使用仓库内的自定义配置文件 # 默认情况下action发现泄露会失败工作流关键参数解析fetch-depth: 0这是Gitleaks扫描历史提交的必备条件。如果只拉取最新提交则无法检测历史泄露。GITLEAKS_CONFIG环境变量指向规则配置文件。直接从官方仓库拉取最新配置能保证识别规则是最新的。对于更定制化的需求你可以在仓库内维护一个.gitleaks.toml文件并通过config-path指定。这个工作流会在每次推送和创建拉取请求时触发一旦Gitleaks在代码或历史记录中发现任何匹配的密钥整个工作流就会失败从而阻止不安全的代码被合并。3.2 第二步构建镜像并集成Trivy扫描接下来我们创建另一个工作流文件负责构建Docker镜像并在推送至仓库前用Trivy进行密钥扫描。创建.github/workflows/build-and-scan.yml。name: Build, Scan and Push on: push: branches: [ main, release/* ] pull_request: branches: [ main ] jobs: build-and-scan: runs-on: ubuntu-latest permissions: contents: read packages: write security-events: write # 用于上传SARIF格式的安全报告到GitHub Security Tab steps: - name: Checkout Code uses: actions/checkoutv4 - name: Set up Docker Buildx uses: docker/setup-buildx-actionv3 - name: Log in to Container Registry uses: docker/login-actionv3 with: registry: ghcr.io # 以GitHub Container Registry为例 username: ${{ github.actor }} password: ${{ secrets.GITHUB_TOKEN }} - name: Build Docker Image run: | docker build -t ghcr.io/${{ github.repository }}/myapp:${{ github.sha }} . docker tag ghcr.io/${{ github.repository }}/myapp:${{ github.sha }} ghcr.io/${{ github.repository }}/myapp:latest - name: Run Trivy vulnerability scanner uses: aquasecurity/trivy-actionmaster with: image-ref: ghcr.io/${{ github.repository }}/myapp:${{ github.sha }} format: sarif output: trivy-results.sarif scanners: vuln,secret,config # 同时扫描漏洞、密钥和配置错误 exit-code: 1 - name: Upload Trivy scan results to GitHub Security tab uses: github/codeql-action/upload-sarifv3 if: always() # 即使扫描失败发现漏洞或密钥也上传报告 with: sarif_file: trivy-results.sarif - name: Push Docker Image (Only if no secrets found) if: success() # 只有Trivy扫描成功即未发现密钥和严重漏洞时才执行推送 run: | docker push ghcr.io/${{ github.repository }}/myapp:${{ github.sha }} docker push ghcr.io/${{ github.repository }}/myapp:latest流程与关键点解读触发条件仅在推送到主分支、发布分支或针对主分支的拉取请求时构建避免为每个开发分支都构建镜像。构建镜像使用Buildx构建并用Git提交哈希${{ github.sha }}和latest打标签。Trivy扫描这是核心步骤。我们使用了Aqua Security官方提供的Trivy Action。scanners: vuln,secret,config同时启用漏洞、密钥和配置扫描一举多得。exit-code: 1至关重要。这指示Trivy在发现任何问题包括密钥时使该步骤失败。结合后续步骤的if: success()条件能有效阻断问题镜像的推送。format: sarif输出SARIF格式报告这是一种标准的安全结果格式。上传安全报告即使用户扫描失败我们也通过if: always()将SARIF报告上传至GitHub仓库的“Security”标签页。这样开发者可以在一个统一界面查看所有安全问题包括Trivy发现的密钥和漏洞。条件推送只有当前面的所有步骤包括Trivy扫描都成功if: success()才会执行镜像推送命令。这样含有密钥的镜像会被彻底拦截在仓库之外。注意secrets.GITHUB_TOKEN是GitHub Actions自动提供的令牌拥有访问当前仓库的权限可用于推送镜像到同一账户下的GitHub Container Registry (ghcr.io)。如果使用其他私有仓库如Harbor、ECR需要配置相应的密钥。4. 高级配置与调优让检测更精准、更高效默认配置能解决80%的问题但要应对复杂场景和减少误报需要进行精细调优。4.1 Gitleaks自定义规则与排除项Gitleaks的默认规则非常全面但有时会误报比如将一段随机字符串误认为密钥或者你需要检测自定义的密钥格式。创建自定义配置文件.gitleaks.tomltitle My Custom Gitleaks Config # 继承官方基础配置 [[rules]] description Generic API Key regex (?i)(?:key|api|token|secret|password)[\s]*[:][\s]*[]?([a-z0-9_\-]{32,})[]? tags [key, generic] # 自定义规则检测格式为 MYCOMPANY_KEY- 开头的内部密钥 [[rules]] description Internal MyCompany Key regex MYCOMPANY_KEY-[a-zA-Z0-9]{24} tags [internal, key] # 全局排除规则忽略特定文件或目录 [allowlist] files [ package-lock.json, # 通常包含大量哈希值易误报 yarn.lock, *.min.js, ] paths [ **/testdata/**, # 忽略测试数据目录 **/vendor/**, # 忽略依赖目录 ] commits [abc123def456] # 忽略某个特定的历史提交不推荐仅用于紧急情况 regexes [ ignore-this-pattern.*, ]使用方式将上述配置文件放入仓库根目录并在GitHub Actions工作流中移除GITLEAKS_CONFIG环境变量Trivy Action会自动发现并使用本地的.gitleaks.toml文件。4.2 Trivy密钥扫描的精准控制Trivy的密钥扫描同样支持高度定制以减少在日志文件、二进制文件中的误报。使用.trivyignore文件在项目根目录创建.trivyignore文件用于在扫描结果中忽略特定的发现。这对于已知且无害的“密钥”非常有用。# 忽略特定镜像层中某个文件的特定行 ghcr.io/myorg/myapp:latest::/usr/src/app/config.json::aws_secret_key::dummy-test-key-12345 # 忽略所有镜像中特定文件类型的扫描结果慎用 *.log *.bin在CI中调整Trivy扫描参数- name: Run Trivy secret scanner uses: aquasecurity/trivy-actionmaster with: image-ref: ghcr.io/${{ github.repository }}/myapp:${{ github.sha }} format: table exit-code: 1 severity: HIGH,CRITICAL # 对于密钥扫描此参数不影响仅用于漏洞扫描 ignore-unfixed: false # 对于密钥此参数不适用 scanners: secret # 关键使用自定义策略文件来定义更复杂的忽略规则 # policy: security/policy.yaml创建自定义策略文件可选进阶对于企业级应用可以编写Rego策略文件来定义复杂的忽略逻辑例如“只有在生产环境镜像中发现的特定类型密钥才报错”。4.3 性能优化与缓存策略扫描可能会成为CI/CD流水线的瓶颈尤其是镜像较大时。以下策略可以提升速度使用Trivy的客户端-服务器模式在自托管Runner上部署一个Trivy服务器CI中的客户端只发送扫描请求由服务器执行繁重的镜像拉取和扫描工作。服务器可以缓存漏洞数据库极大提升速度。# 启动Trivy服务器 trivy server --listen 0.0.0.0:8080 # 在CI中使用客户端模式扫描 trivy client --remote http://your-trivy-server:8080 image your-image:tag利用Docker层缓存优化Dockerfile将不常变化的依赖安装步骤放在前面经常变化的代码放在后面。这样当代码变更时只需要重建最后几层Trivy扫描也可以利用缓存只扫描新增或变化的层Trivy本身支持层缓存。合理安排扫描时机对于开发分支的每次推送可以只运行Gitleaks。仅在代码合并到主分支或创建发布标签时触发包含镜像构建和Trivy扫描的完整流程。这能显著减少资源消耗。5. 典型问题排查与修复指南即便配置得当在实际操作中仍会遇到各种问题。下面是一些常见场景及解决方法。5.1 误报处理这不是真正的密钥场景Trivy报告在package-lock.json或一个编译后的vendor.bundle.js文件中发现了“AWS密钥”但实际上那只是一段符合密钥格式的哈希字符串或占位符。排查与解决确认泄露真实性首先手动检查Trivy报告指出的文件和具体行内容。确认它是否是一个真实的、正在使用的密钥还是无害的伪随机字符串。添加排除规则针对文件如果是整个文件类型都容易误报如*.min.js将其添加到.trivyignore或Gitleaks的allowlist.files中。针对特定模式如果误报有固定模式如test-key-开头可以在Gitleaks的自定义规则中将其设为低置信度或在.trivyignore中使用正则表达式忽略。重要原则排除范围应尽可能精确避免“一刀切”忽略整个目录以免漏掉真正的泄露。使用--secret-configTrivyTrivy允许通过--secret-config参数指定一个YAML文件自定义密钥检测规则和排除项实现更精细的控制。5.2 漏报处理为什么没检测出我的测试密钥场景为了测试你在代码中写了一个明显的AWS_SECRET_KEY12345但扫描没有报警。排查与解决检查规则首先确认你使用的规则配置是否包含该类型密钥的检测模式。例如过于简单的12345可能不符合默认规则中关于密钥复杂度的定义如长度、字符集。检查扫描范围Gitleaks是否扫描了完整的Git历史fetch-depth: 0文件是否在允许列表中被意外排除Trivy确认扫描命令包含了--scanners secret参数。检查目标镜像标签是否正确。更新规则库Gitleaks和Trivy的检测规则都在不断更新。确保你使用的工具版本和规则配置是最新的。对于Gitleaks Action使用官方最新的configURL对于Trivy它会自动更新漏洞数据库但也要定期升级Action版本。测试验证可以定期在测试分支中故意引入一个已知的、符合格式的测试密钥如一个无效的GitHub Personal Access Token验证整个流水线是否能正确捕获并告警。5.3 镜像扫描超时或失败场景CI流水线中的Trivy扫描步骤耗时过长甚至超时失败。排查与解决镜像大小检查你的基础镜像是否过大。考虑使用更轻量的基础镜像如Alpine Linux版本。网络问题Trivy需要拉取漏洞数据库。如果CI Runner处于内网或网络受限环境可能会超时。解决方案为Trivy配置HTTP代理。在内网搭建一个Trivy服务器并配置CI使用内网服务器地址同时定期从外网同步数据库。资源不足CI Runner的内存或CPU可能不足。尝试升级Runner规格或者调整Trivy的并发度--parallel参数但需谨慎。使用离线扫描在极端网络环境下可以预先在可联网的机器上使用trivy image --download-db-only下载数据库然后将数据库文件拷贝到CI Runner上使用--skip-db-update和--offline-scan参数进行扫描。5.4 密钥修复流程一旦发现真实的密钥泄露必须立即按流程修复立即撤销密钥这是第一步且最重要的一步。立即前往相关服务AWS IAM、GitHub Settings等撤销或轮换泄露的密钥。即使镜像还未被广泛拉取也应视为已泄露。清理Git历史如果密钥已提交到Git仅仅在最新提交中删除文件是不够的历史记录中仍然存在。必须使用git filter-branch或BFG Repo-Cleaner等工具将密钥从整个Git历史中彻底清除。警告这会重写历史需要所有协作者同步。重建并推送新镜像在代码中的密钥被清除后触发CI/CD流水线重新构建镜像。新的镜像将不再包含泄露的密钥。更新所有环境将部署在测试、生产等环境中的旧镜像替换为新构建的安全镜像。审计与复盘分析密钥泄露的原因。是开发人员将本地.env文件误提交还是构建脚本有问题更新开发规范和安全培训内容防止同类问题再次发生。

相关新闻

零基础实战:基于 PaddleVideo 与 PP-TSM 的自定义视频分类全流程指南

零基础实战:基于 PaddleVideo 与 PP-TSM 的自定义视频分类全流程指南

零基础实战:基于 PaddleVideo 与 PP-TSM 的自定义视频分类全流程指南 随着短视频与多媒体内容的爆发式增长,如何快速、准确地分析海量视频资源,成为了当前 AI 领域亟待解决的核心痛点。视频理解技术能够自动提取视频中的时空特征并进行语义分…

2026/7/7 4:38:04阅读更多 →
M3imic:面向人形机器人的多模态运动理解与实时全身控制框架

M3imic:面向人形机器人的多模态运动理解与实时全身控制框架

1. 项目概述:这不是又一个“动作复刻”Demo,而是一套能真正让机器人“看懂并执行复杂运动意图”的全身控制中枢M3imic这个名字乍一听像某个开源模型的代号,但拆开来看,“M3”指向Multi-Modal Motion(多模态运动&#x…

2026/7/7 4:38:04阅读更多 →
论领域驱动设计在复杂业务中台架构中的应用

论领域驱动设计在复杂业务中台架构中的应用

思维导图 精简版本 背景角色:零售全渠道订单中台(3万日单/8k TPS/8月/24人)。我任架构师,全程主导DDD落地,含事件风暴、上下文划分、四层架构、聚合建模、事件驱动与性能调优。 核心实践:①事件风暴绘时间轴,输出《术…

2026/7/7 4:33:04阅读更多 →
人工智能训练师-理论知识考点速记(下):模型训练+测试+运维

人工智能训练师-理论知识考点速记(下):模型训练+测试+运维

一、模型训练核心考点速记 1.1 训练全流程结构图 ┌──────────────────────────────────────────────────────────────┐ │ 模型训练全流程 │ │ …

2026/7/7 5:43:12阅读更多 →
什么是运算放大器(运放)

什么是运算放大器(运放)

场景一:传感器信号太小,单片机读不到你接了一个麦克风或光敏电阻,输出只有 0~50mV。 但是 Arduino / 单片机的 ADC 需要 0~5V 才能识别。 直接接上去,读数永远是 0。运放帮你做什么?放大信号。用一个同相放大器&#x…

2026/7/7 5:43:12阅读更多 →
Audacity音频编辑完全指南:从新手到专家的免费音频处理解决方案

Audacity音频编辑完全指南:从新手到专家的免费音频处理解决方案

Audacity音频编辑完全指南:从新手到专家的免费音频处理解决方案 【免费下载链接】audacity Audio Editor 项目地址: https://gitcode.com/GitHub_Trending/au/audacity 你是否曾经因为音频质量问题而烦恼?录制播客时总有环境噪音干扰&#xff1f…

2026/7/7 5:43:12阅读更多 →
出国必备丨疫苗接种本翻译件怎么办理?流程+费用一文说清

出国必备丨疫苗接种本翻译件怎么办理?流程+费用一文说清

内容摘要:办理出国留学、签证或移民时,一份合规的疫苗接种本(儿童预防接种证)翻译件是不可或缺的过审材料。为了确保翻译资质符合海外学校、使领馆及卫生部门的严格审核,建议通过资质合规的线上平台(如“慧…

2026/7/7 5:43:12阅读更多 →
分析:c语言定义typedef给类型起别名的原因(重点论述:不透明类型(封装))

分析:c语言定义typedef给类型起别名的原因(重点论述:不透明类型(封装))

最近,我在看linux内核源码,里面大量代码直接使用了结构体或者共用体类型的原始类型名,也就是带着关键字“struct”、“union”、“enum”等,这样有个好处就是我们一读到类型名因为有前缀,所以一眼就看出是什么类型&…

2026/7/7 5:43:12阅读更多 →
AI绘画工具文化细节测试:以白无垢和服生成为例

AI绘画工具文化细节测试:以白无垢和服生成为例

🚀 30款热门AI模型一站整合,DeepSeek/GLM/Qwen 随心用,限时 5 折。 👉 点击领海量免费额度 1. 先搞清楚这个测试到底在验证什么 看到“舞萌ai测试”这个标题,很多人第一反应可能是舞蹈动作生成或者角色换装。但从“…

2026/7/7 5:38:11阅读更多 →
从GitHub安全案例解析常见漏洞与防护实践

从GitHub安全案例解析常见漏洞与防护实践

1. 项目概述:从GitHub Trending看安全实战 最近在GitHub Trending上看到一个项目,叫 skills4/skills ,它因为一些安全漏洞案例被大家讨论。这其实是一个挺典型的场景:一个旨在展示或教授某种技能的仓库,本身却成了安…

2026/7/7 4:43:43阅读更多 →
MLT 2026启示:因果推理与概率建模驱动下一代LLM应用

MLT 2026启示:因果推理与概率建模驱动下一代LLM应用

# MLT 2026启示:因果推理与概率建模驱动下一代LLM应用## 一、背景与挑战:从“黑箱预测”到“可信推理”2026年6月,第7届机器学习与趋势国际会议(MLT 2026)将在悉尼召开。会议议程中,“因果与可解释机器学习…

2026/7/7 2:56:31阅读更多 →
通达OA SQL注入漏洞深度剖析:从手工注入到自动化利用与防御

通达OA SQL注入漏洞深度剖析:从手工注入到自动化利用与防御

1. 项目概述与漏洞背景最近在梳理一些历史OA系统的安全风险时,通达OA v11.6版本中的一个老漏洞又进入了我的视线。这个漏洞位于/general/bi_design/appcenter/report_bi.func.php文件中,是一个典型的SQL注入点。虽然这个漏洞的利用方式看起来并不复杂&am…

2026/7/7 1:03:28阅读更多 →
Acunetix v24.8 深度解析:DAST漏洞扫描器核心原理与DevSecOps实践

Acunetix v24.8 深度解析:DAST漏洞扫描器核心原理与DevSecOps实践

1. 项目概述:Acunetix v24.8 高级版漏洞扫描器深度解析作为一名在网络安全领域摸爬滚打多年的老兵,我深知一款趁手的“兵器”对于安全测试工作意味着什么。今天要聊的,就是Web应用安全测试领域里一个响当当的名字——Acunetix。特别是其v24.8…

2026/7/7 0:02:41阅读更多 →
国产化信创改造:达梦/人大金仓适配与多数据库兼容方案实战(SpringBoot)

国产化信创改造:达梦/人大金仓适配与多数据库兼容方案实战(SpringBoot)

国产化信创改造:达梦/人大金仓适配与多数据库兼容方案实战(SpringBoot) 🌐 演示地址:http://ruoyioffice.com | 📦 源码1GitHub:ruoyi-office | 📦 源码2GitCode:ruoyi-o…

2026/7/7 0:02:41阅读更多 →
CentOS 7/8 SSH 连接失败:5步系统性排错流程与决策树

CentOS 7/8 SSH 连接失败:5步系统性排错流程与决策树

CentOS SSH连接故障排查:从基础检查到深度修复的完整指南引言当你尝试通过Xshell或其他SSH客户端连接CentOS服务器时,突然遭遇"Connection refused"或"Connection timed out"的错误提示,这种经历对任何运维人员或开发者来…

2026/7/7 0:02:41阅读更多 →
YOLOv8推理性能优化:从1.2FPS到35FPS的全链路加速实践

YOLOv8推理性能优化:从1.2FPS到35FPS的全链路加速实践

如果你在部署 YOLOv8 时,发现推理速度只有可怜的 1-2 FPS,而别人的演示视频却能跑到 30 FPS 以上,那么问题很可能不在模型本身,而在于你的整个处理链路。很多开发者拿到一个训练好的 YOLOv8 模型后,会直接使用官方示例…

2026/7/7 5:11:21阅读更多 →
Coze与Dify对比指南:低代码AI应用开发从入门到实战

Coze与Dify对比指南:低代码AI应用开发从入门到实战

1. 从零到一:为什么你需要了解 Coze 和 Dify?如果你对 AI 应用开发感兴趣,但一看到“大模型”、“智能体”、“工作流”这些词就头疼,觉得门槛太高,那这篇文章就是为你准备的。很多开发者,包括我自己&#…

2026/7/7 5:11:21阅读更多 →
AI生图工具怎么选?2026年6月版实测对比

AI生图工具怎么选?2026年6月版实测对比

做自媒体的朋友应该都有体会:配图一直是个让人头疼的问题。2026年,AI生图工具已经非常成熟了,但工具太多反而不知道怎么选。以下是截至2026年6月我对主流AI生图工具的实测对比。Midjourney V8.1:速度之王2026年6月11日&#xff0c…

2026/7/7 5:11:21阅读更多 →