dcCarreto/CofreDeSenhas
GitHub: dcCarreto/CofreDeSenhas
一款基于 C# 和 Avalonia 开发的开源跨平台密码管理器,提供加密本地保险箱、密码生成和安全审计功能。
Stars: 1 | Forks: 0
# 密码保险箱
跨平台密码管理器(支持 Windows 和 Linux),内置密码生成器和加密的本地保险箱。该应用程序在单一界面中集成了高强度密码创建和凭证安全存储功能,由主密码和 AES-256-GCM 加密技术提供保护。它使用 C# 和 .NET 10 以及 Avalonia 开发,所有平台共用同一套代码库。
[](https://github.com/dcCarreto/CofreDeSenhas/actions/workflows/ci.yml)




这是一个开源自由软件项目,基于 MIT 许可证分发。您可以自由使用、学习、修改和分享它。
## 目录
- [关于项目与开源软件](#sobre-o-projeto-e-o-software-livre)
- [概述](#visão-geral)
- [截图](#capturas-de-tela)
- [功能](#funcionalidades)
- [安全模型](#modelo-de-segurança)
- [安全政策与漏洞披露](SECURITY.md)
- [下载与安装](#download-e-instalação)
- [项目结构](#estrutura-do-projeto)
- [架构](#arquitetura)
- [技术栈](#tecnologias)
- [系统要求](#requisitos)
- [编译与运行](#compilação-e-execução)
- [测试](#testes)
- [生成可执行文件](#geração-do-executável)
- [数据存储](#armazenamento-de-dados)
- [路线图](#roadmap)
- [如何贡献](#como-contribuir)
- [许可证](#licença)
## 关于项目与开源软件
我一直认为,优秀的工具应该触手可及。我是在开源软件的支持下学习编程的,通过阅读前辈们的代码成长,因此我从一开始就坚持尊重许可证、给予应有的署名,并将社区赋予我的回报给社区。对我来说,尊重开源从来不是一种形式:这是最诚实的一种构建方式。
密码保险箱正是诞生于这种信念。安全和隐私不应成为有钱人的特权,因此我决定将此项目开源、免费,并允许任何人自由使用、审查、修改和分发。我相信无障碍性与安全是相辅相成的:一个保护人们密码的程序必须能够被人们检查。最终,任何人都可以审计的代码,才是可以信任的代码。
如果这个项目对您有用,请放心使用。如果您想改进它,欢迎加入。它是为所有人服务的。
这款应用诞生于自由,并将继续保持自由。未来的任何发展都不会改变这一点:源代码将根据 MIT 许可证保持开放,没有付费版本,没有隐藏在订阅背后的功能,也不收集数据。项目的每一个新阶段都恪守这一承诺。
## 概述
该程序默认完全在本地运行:除了可选的密码泄露检查(使用安全模型中描述的匿名协议)外,不会向外部服务器发送任何数据。凭证保存在用户配置目录下的加密文件中,加密密钥在 runtime(运行时)根据主密码推导得出,绝不写入磁盘。您还可以选择将保险箱连接到您选择的数据库(SQLite, PostgreSQL, MySQL/MariaDB 或 SQL Server);在这种情况下,本地保险箱与数据库将进行同步并保持镜像,密码始终保持加密存储状态。
主窗口具有侧边导航栏(保险箱、收藏、最近和分类),中间是凭证列表,提供搜索、按分类筛选、审计以及各项操作功能。密码生成器可在面板中按需打开,并与主密码界面的解锁功能并排显示,允许您在打开保险箱之前创建并复制密码。
## 截图
主界面整合了侧边导航栏、凭证列表和底部的保险箱状态栏,采用“保险箱、拉丝黄铜”的视觉标识:独特的暗色主题,以拉丝黄铜为亮点,标题使用衬线字体。以下图片中的数据仅为演示用的虚构数据。

在主密码界面,左侧是生成器,右侧是解锁区域,带有语言选择器。在 Windows 上,还提供通过 Windows Hello 解锁的选项:

## 功能
### 密码生成器
- 长度可在 4 到 64 个字符之间调整。
- 字符类型选择:大写字母、小写字母、数字和符号。
- 基于词汇表的密码短语模式,可配置单词数量、分隔符、大小写和末尾数字。
- 实时密码强度可视化指示器。
- 一次生成多个密码,数量可配置。
- 灵活的生成密码显示区域:长密码和多个密码会使文本框垂直扩展,将其他控件向下推,必要时左侧面板会滚动。
- 基于加密随机数生成器(`RandomNumberGenerator`)生成,而不是普通的伪随机生成器。
- 在解锁前的主密码界面也可使用:无需打开保险箱即可生成和复制密码,只有通过身份验证后才会提示是否保存。
生成器面板,包含生成的密码、强度指示器和字符选项:

### 密码保险箱
- 凭证的添加、编辑和删除,包含服务名称、用户名、密码、URL、分类、标签、备注和收藏标记字段。
- 凭证类型:除了标准登录外,还提供六个现成的模板(卡片、许可证密钥、Wi-Fi、服务器、数据库以及登录本身),每个模板会将字段重命名为相应的词汇,并显示特定的额外字段(卡片:有效期、CVV、发卡机构;Wi-Fi:安全协议、频段;服务器/数据库:host、端口等),每个字段均独立加密。
- 每条凭证的 TOTP 代码(两步验证):粘贴密钥(Base32)或 `otpauth://` 链接,保险箱会在本地生成六位数字代码,在创建和编辑时提供实时预览和倒计时,并支持在列表中一键复制。
- 每条凭证的恢复代码:粘贴一个或多个备份代码(每行一个),每个都可以单独复制、标记为已使用或删除,默认情况下像密码一样隐藏。
- 预设分类(工作、个人、财务、社交和其他),当选择“其他”时可使用自定义分类,以及适用于任何分类的自由标签,每条凭证可添加多个标签。
- 实时搜索服务名称、用户名或自定义分类,支持按分类和按标签筛选,这些筛选条件还可以与收藏和审计筛选结合使用。
- 侧边导航栏提供前往完整保险箱、收藏、最近记录、回收站以及各个分类的快捷方式。
- 加密回收站:删除凭证会将其移至回收站而不是立即清除,并显示删除日期。在回收站中,您可以恢复、永久删除或一次性清空所有内容,在进行任何永久删除前始终需要确认。
- 每个已存储密码的强度指示器。
- 保险箱安全报告:综合评分(0 到 100),基于弱密码、重复密码、旧密码和被泄露密码,以及没有两步验证、没有 URL 或没有分类的账户进行计算。报告中的每一行都可以点击,以按该问题筛选主列表。泄露检查(Have I Been Pwned,基于 k-anonymity)由该界面触发,且始终是可选的;其余所有内容均在本地计算。
- 每条凭证的密码历史记录:每次更改时,旧密码都会连同替换日期以加密形式保存,可以在编辑界面中查看、复制或重新使用。系统会保留最近的十个版本。
- 加密附件:每条凭证最多可添加 5 个文件(每个 5 MB,整个保险箱总计 100 MB),每个文件都单独加密(AES-256-GCM)并与主保险箱分开存储。它们仅保留在本地设备上,不会同步到已连接的数据库。
- 列表包含服务图标、分类和快捷操作,如显示、复制、置顶和编辑。
- 可点击列表标题,按服务、用户名、分类或强度进行排序,并指示当前活动的列和排序方向。
- 服务、用户名、分类、日期和操作列的宽度可调整,并在调整窗口大小时按比例重新分配宽度。
- 直接在列表中内联编辑服务名称。
- 单击 `Usuário` 列即可复制用户名,并在该行显示临时的视觉确认。
- 针对最常见操作的键盘快捷键(`Ctrl+F` 搜索,`Ctrl+N` 新建密码,`Ctrl+G` 生成器,`Ctrl+L` 立即锁定保险箱,`Ctrl+H` 隐私模式,`Ctrl+Shift+U`/`Ctrl+Shift+P` 复制焦点行的用户名/密码),完整的快捷键列表可在“设置 → 帮助 → 键盘快捷键...”中查看。
编辑凭证时,集成了服务名称、用户名、密码、URL、分类和备注,同时实时计算 TOTP 代码并显示历史密码:

审计功能会在列表中直接标记出弱密码、重复密码或长时间未更新的密码,而安全报告则将所有内容汇总为整个保险箱的综合评分,所有计算均在本地完成,不会向外部发送任何数据:

### 安全与身份验证
- 创建和每次打开保险箱时都需要主密码。
- 解锁尝试次数限制,连续失败后将暂时锁定。
- 在设定的非活动时间后自动锁定,可在设置菜单中配置(关闭、1、5、15 或 30 分钟),并返回主密码界面。
- 在 Windows 上支持通过 Windows Hello/生物识别解锁,可通过设备激活,并以主密码作为后备。
- 可通过设置菜单更改主密码,自动重新加密整个保险箱,并在失败时提供备份和回滚功能。
- 错误信息会翻译为当前激活的语言,而不是显示原始的技术文本(密码、生成、导出、导入、更改主密码、附件、本地持久化)。原始错误仍会记录在磁盘上的滚动诊断日志中(限制为 1 MB)以便调查。
- 设置菜单中的危险区域:“清除保险箱”会将所有凭证移至回收站(可逆),“删除保险箱”会永久删除本地保险箱、附件、主密码及关联的生物识别凭证——在确认前始终需要通过主密码重新验证身份。
### 备份与恢复
- 本地自动备份:可配置备份频率(手动、每天或每周)、保留的最大备份数量(5、10 或 20),并可随时在设置菜单的“备份和还原...”界面进行手动备份。列表中列出的任何备份都可以还原,在替换当前保险箱之前始终会发出警告并要求确认。备份始终保持加密状态。
- 将保险箱导出和导入为便携式文件(`.gsenhas`),该文件由独立于主密码的导出密码保护。
- 导入来自其他管理器的 CSV 文件(Bitwarden, LastPass, 1Password, Chrome/Edge, Firefox, KeePass, Dashlane, NordPass 和通用格式),自动检测分隔符并根据标题映射列,同时保留 TOTP 密钥和收藏标记。
- 可选生成用于备份主密码的 QR code,在创建保险箱和每次更改主密码时提供。QR code 显示的是主密码的密码短语版本,而不是逐字符的原始密码。
### 设备间同步(共享文件夹)
- 设置菜单中的“同步...”项通过共享文件夹(Dropbox, OneDrive, Google Drive 或任何通过其他方式同步的文件夹)将保险箱连接到其他设备——应用程序只在该文件夹中读取和写入一个加密文件,不直接与任何提供商通信。
- 同步密钥根据主密码本身派生(所有设备使用相同的密码),数据在写入前使用 AES-256-GCM 加密:云提供商永远不会看到明文。
- 在解锁时、可配置的间隔(5 到 60 分钟)内或按需进行同步;如果没有可访问的文件夹,保险箱仍将保持 100% 本地运行。冲突解决以每条完整凭证的最新编辑为准,包括从回收站中删除和还原。附件目前尚不通过此方式同步。
- 专为同步您自己的设备而设计,无需维护数据库——如果要与信任的其他人共享保险箱或自行托管存储,请使用下文的外部数据库连接。
### 外部数据库(自行托管/共享)
- 通过设置菜单连接到外部数据库,支持 SQLite, PostgreSQL, MySQL/MariaDB 和 SQL Server,并提供连接测试。专为自行托管或与信任的其他人共享而设计——如果只想同步自己的设备而不维护数据库,请使用上面的共享文件夹同步。
- 每条凭证都有一个稳定的标识(`guid_id`),与共享文件夹同步使用的相同。连接时,两个数据库按凭证合并:发生冲突时,以最新编辑为准——不再是“本地保险箱始终优先”。
- 此后两者将保持镜像:每次创建、编辑或删除都会同时记录在本地保险箱和数据库中。
- 检测 `CofreDeSenhas` 表,如果不存在则提供创建选项,并进行轻量级迁移,向已存在的表中添加新列——目前包括 URL、分类、凭证类型和额外字段、历史密码、收藏和置顶,这些字段与通过加密文件夹同步的字段相同。
- 密码始终以加密形式保存,绝不以明文形式;服务名称、用户名、备注和标签在相应的列中以明文形式保存(参见[威胁模型](THREAT_MODEL.md))。
- 系统会记住最后一次的连接配置文件,以加快重新连接的速度;数据库服务器密码绝不写入磁盘。
### 界面
- 无边框窗口,带有圆角和自由调整大小功能。
- 独特的“保险箱,拉丝黄铜”视觉标识:独特的暗色主题(无主题切换),以炭灰色为基调,拉丝黄铜为唯一亮点,标题使用衬线字体(正文使用 Plus Jakarta Sans),棱角更加分明,在处于活动状态的导航项和强度计量器上有一个小的装饰性黄铜铆钉。整个界面采用统一一致的图标目录。
- 隐私模式:标题栏上的一个按钮(或快捷键 `Ctrl+H`)可立即隐藏列表中每条凭证的服务名称、用户名、分类/标签和头像,将其全部替换为中性的占位符——适用于共享环境或截图。这是一种会话模式:打开保险箱时始终处于关闭状态。
- 无障碍功能:色盲模式(红绿色盲、绿色盲、蓝色盲和单色觉)、高对比度、字体缩放、减少动画以及增强的屏幕阅读器支持。
- 国际化界面,语言选择在巴西葡萄牙语、英语、西班牙语、法语、德语和意大利语之间持久保存。
- 保险箱布局经过调整分配,以优先考虑用户名的读取,操作图标更易读,分类标签更紧凑。
- 按服务划分的可视化图标库,默认以首字母缩写作为本地后备。在互联网上搜索真实 favicon 是可选的,且默认关闭:在设置菜单中激活此功能时,应用程序会征求同意,并且仅发送每个服务的域名(绝不发送密码、用户名或其他数据)。下载的图标会在磁盘上缓存,关闭该功能时会清除缓存。
- 可执行文件、窗口和系统托盘(在图形环境提供支持的情况下)都有自己的专属图标。
- Windows 和 Linux 上的界面和行为完全相同。
设置菜单汇集了更改主密码、自动锁定、语言、无障碍、CSV 导入、数据库连接和 Windows Hello 等功能:

### 自动更新
- 设置菜单中的“检查更新”项(默认开启)会在每次打开保险箱时查询 GitHub 上的最新 release。如果有新版本,底部栏会显示“立即更新”按钮。
- 该按钮会下载安装程序(或便携式可执行文件,具体取决于保险箱当前的运行方式),并与 release 本身的 `CHECKSUMS.txt` 核对 SHA256 hash,只有在匹配时才会自动应用更新:以静默模式安装或在原位替换便携式可执行文件,关闭保险箱并自动重新打开新版本——无需手动运行安装程序。
- 任何失败(无网络连接、checksum 不匹配、找不到文件)或在 Windows 以外的环境下,都会回退到以前的行为,即在浏览器中打开 releases 页面。查询和下载是对 GitHub API 的公共读取操作,除此之外不发送任何数据。
## 安全模型
| 项目 | 详情 |
|------|---------|
| 保险箱加密 | AES-256-GCM,确保机密性以及完整性/真实性 |
| 密钥派生 | Argon2id(64 MiB 内存,3 次迭代,并行度为 1),这是目前推荐的标准,因为它更能抵抗 GPU/ASIC 攻击,使用 128 位随机 salt。仍使用 PBKDF2-SHA256(来自以前版本)的保险箱将在下次通过主密码解锁时透明地迁移,并提供安全的备份和回滚 |
| 主密码 | 绝不存储。身份验证文件只保存 salt 和一个验证器(派生密钥的 SHA-256 hash) |
| 导出 | AES-256-GCM,密钥由独立的导出密码通过 PBKDF2-SHA256(200,000 次迭代)派生 |
| 敏感比较 | 采用常数时间比较,以防范时序攻击 |
| 泄露检查 | Have I Been Pwned 基于 k-anonymity:只有密码 SHA-1 hash 的前 5 个字符会离开本机 |
| 服务图标 | 默认使用首字母本地后备;互联网上的 favicon 搜索是可选的,默认关闭且需要同意。启用时,仅将每个服务的域名发送到 Google 图标服务(绝不发送密码、用户名或备注),图标会在磁盘上缓存 |
| TOTP 代码 | 2FA 密钥像密码一样加密保存(AES-256-GCM);代码在本地计算(RFC 6238),不向网络发送任何内容 |
| 密码历史记录 | 每个旧密码像当前密码一样加密保存(AES-256-GCM),并在更改主密码时重新加密;仅保留在保险箱和导出文件中 |
| 数据库中的保险箱 | 连接到外部数据库时,密码列只保存加密文本(AES-256-GCM);数据库服务器密码不会写入磁盘 |
| Windows Hello | 在 Windows 上可选。保险箱密钥使用从 Windows Hello 凭证签名(TPM 中的私钥)派生的密钥进行加密(AES-256-GCM);只有在生物识别身份验证后才能打开 `biometria.dat` 中的信封 |
| 内存清理 | 锁定或关闭保险箱时,主密钥及其内部副本会从内存中清除(`CryptographicOperations.ZeroMemory`);详细信息面板和列表中显示的行不会在必要时间之外保留明文密码 |
| 数据位置 | 用户文件夹(Windows 上为 `%APPDATA%\GerenciadorSenhas\`,Linux 上为 `~/.config/GerenciadorSenhas/`),位于代码库之外 |
重要说明:
- 加密密钥在每次运行时根据主密码派生。如果主密码丢失,则无法恢复保险箱,因为密钥不会存储在任何地方。
- 更改主密码时,将派生新密钥并重新加密所有条目。该操作会备份文件并在出现故障时还原,以避免导致保险箱无法访问。
- 扫描时,备份的 QR code 包含主密码的密码短语版本。每个字母由一个单词表示,数字保持为数字,常见符号变为可读的名称。这是一种编码,而不是加密。因此它是可选的并伴有警告:必须将其保存在安全的离线地点。
要了解如何报告在保险箱中发现的漏洞,请参阅[安全政策](SECURITY.md)。要了解保险箱安全设计涵盖的内容以及刻意排除的内容,请参阅[威胁模型](THREAT_MODEL.md)。
## 下载与安装
使用该程序最简单的方法是从 [releases](../../releases) 页面下载编译好的可执行文件。在任何平台上,二进制文件都是独立的(self-contained):无需安装 .NET 或任何依赖项。
在 Windows 上:
1. 访问[最新版本](../../releases/latest)。
2. 下载安装程序 `CofreDeSenhas-Setup-X.Y.Z.exe`。
3. 运行并按照向导操作。无需管理员权限:默认情况下,该程序仅为当前用户安装,并在开始菜单中创建快捷方式(也可选择在桌面上创建),之后可以在“应用和功能”中卸载。
4. 如果您不想安装任何内容,页面中还提供了独立的可执行文件 `CofreDeSenhas.exe`(无需安装程序)——下载并运行即可。
要卸载,请使用 Windows 的“应用和功能”(或开始菜单中的“卸载 Cofre de Senhas”快捷方式)。默认情况下,`%APPDATA%\GerenciadorSenhas` 中的保险箱会被保留;卸载程序会明确询问您是否也要删除这些数据,默认选项是保留。
在 Linux 上,最简单的方法是使用 **AppImage**:在[最新版本](../../releases/latest)中下载 `CofreDeSenhas-X.Y.Z-x86_64.AppImage`,赋予执行权限并运行——无需安装 .NET 或任何其他组件:
```
chmod +x CofreDeSenhas-X.Y.Z-x86_64.AppImage
./CofreDeSenhas-X.Y.Z-x86_64.AppImage
```
它可以在任何现代 x86_64 发行版上运行。如果您使用 AppImage 集成工具(AppImageLauncher, Gear Lever 等),它会自动集成图标和菜单快捷方式;如果没有,直接执行文件即可。也可以在本地使用 `App/distribuicao/gerar-appimage.sh` 生成 AppImage(需要 .NET 10 SDK 和可用的 `appimagetool`)。
如果您更喜欢从源代码编译,或者希望不依赖 AppImage 集成工具就能获得应用菜单快捷方式,可以使用安装脚本。该脚本需要安装 .NET 10 SDK,它将为当前用户编译、发布并注册应用程序(无需 sudo):
```
./App/distribuicao/instalar.sh
```
该脚本将二进制文件发布到 `~/.local/opt/cofre-de-senhas`,在应用程序菜单中注册“Cofre de Senhas”快捷方式并安装图标。要卸载,请执行 `./App/distribuicao/desinstalar.sh`(`~/.config/GerenciadorSenhas` 中的保险箱会被保留)。AppImage 和脚本均可在 X11 和 Wayland 环境中运行。
`.deb` 包和 Flatpak 已经过评估,但目前暂不考虑:它们需要维护自己的存储库(或在 Flathub 上发布)以进行自动更新,这对于单一的维护者来说投入与产出不成正比,而且 AppImage 已经涵盖了“下载即运行”的用例,无需依赖包管理器。如果有需求,这会作为未来的可能性(参见[路线图](ROADMAP.md))。
首次使用时,程序会要求您创建主密码。请妥善保管:这是打开保险箱的唯一方式。在一个平台上导出的保险箱(`.gsenhas`)可以在另一个平台上导入。
### 验证文件完整性
从此版本开始发布的每个 release 都包含一个 `CHECKSUMS.txt`,其中包含每个提供文件的 SHA256 hash。下载后,您可以检查文件在传输过程中是否被更改:
```
# Windows (PowerShell)
Get-FileHash .\arquivo-baixado -Algorithm SHA256
# Linux / macOS (在文件下载的文件夹中)
sha256sum -c CHECKSUMS.txt
```
将计算出的值与 `CHECKSUMS.txt` 中的值进行比较。
从 2.1.0 版本开始,发布的每个文件还包含来源证明(SLSA/Sigstore)——这是一份签名证明,证明该确切的文件是由此代码库的 release workflow 从特定 commit 生成的,而不是在其外部组装或更改的。这比单纯的 hash 提供了更强的保证:hash 证明文件自发布以来未被更改,而证明则说明了它的来源。验证需要 [GitHub CLI](https://cli.github.com/):
```
gh attestation verify arquivo-baixado --owner dcCarreto
```
这些文件目前尚未经过数字签名(在 Windows 上即 Authenticode)——这需要付费证书,是未来评估的项目(参见[路线图](ROADMAP.md))——因此,目前可用的验证方式是 hash + 证明。
## 项目结构
```
CofreDeSenhas.sln
├─ App/ Interface (Avalonia), multiplataforma
│ ├─ Janelas/ Telas e diálogos da aplicação
│ ├─ Controles/ Controles customizados de UI
│ ├─ Infraestrutura/ Tema, preferências, recursos e utilitários
│ ├─ Ativos/ Ícone do aplicativo
│ └─ distribuicao/ Scripts e atalhos de instalação (Linux e Windows)
├─ GerenciadorDeSenhas/ Biblioteca de domínio
│ ├─ Modelos/ Entidades (Senha, Categoria, SenhaExportada,
│ │ TipoBanco, ConexaoBanco)
│ ├─ Repositorios/ Acesso às credenciais (arquivo local, banco e
│ │ espelho que sincroniza os dois)
│ └─ Servicos/ Criptografia, persistência, autenticação,
│ exportação, verificação de vazamento, conexão
│ a banco de dados e regras
└─ GerenciadorDeSenhas.Testes/ Testes automatizados (xUnit)
```
该解决方案将界面(`App` 项目)与领域逻辑(`GerenciadorDeSenhas` 项目)分离开来。这使得业务规则和加密独立于图形层,并允许对它们进行独立测试。
## 架构
应用程序采用分层架构,不强制依赖数据库或外部服务:
- 表示层(`App` 项目):使用 Avalonia 编写的窗口和控件,布局采用 XAML,自定义控件通过代码绘制。不包含业务规则或加密操作。
- 领域和服务层(`GerenciadorDeSenhas` 项目):主密码身份验证、加密、持久化、导出、审计和泄露检查。
- 持久化层:默认情况下,数据序列化为 JSON 并以加密形式保存在用户配置目录下的文件中。或者,可以通过 ADO.NET 将保险箱同步并保持与外部数据库(SQLite, PostgreSQL, MySQL/MariaDB 或 SQL Server)的镜像,密码始终保持加密状态。
主密码简要流程:
1. 创建时,生成随机 salt;密钥通过 Argon2id(64 MiB,3 次迭代,并行度 1)派生,并从中计算出 SHA-256 验证器。只有 salt、验证器和派生参数被写入 `auth.dat`。密钥从不持久化。
2. 打开时,根据输入的密码、保存的 salt 和参数重新派生密钥;验证器在常数时间内进行比较。如果匹配,则在会话期间使用密钥解密保险箱。仍使用 PBKDF2-SHA256(来自旧版本)的保险箱会在此时迁移:使用 Argon2id 重新派生密钥,并重新加密整个保险箱,同时提供自动备份和回滚。
3. 更改主密码时,使用旧密钥解密整个保险箱,并使用新密钥重新加密,提供自动备份和回滚。
4. 锁定或关闭保险箱时,主密钥及其内部副本会从内存中清除。
##技术栈
- C# 和 .NET 10。
- Avalonia 和 XAML 用于构建跨平台界面(Windows 和 Linux)。
- 标准库加密(`System.Security.Cryptography`):AES-256-GCM 和 PBKDF2-SHA256(用于导出和旧版保险箱迁移),以及 Argon2id(`Konscious.Security.Cryptography.Argon2`)用于保险箱密钥。
- 使用 `System.Text.Json` 进行序列化。
- 通过 ADO.NET 访问数据库:Microsoft.Data.Sqlite, Npgsql, MySqlConnector 和 Microsoft.Data.SqlClient。
- 使用 QRCoder 库生成 QR code。
- 使用 xUnit 进行测试。
## 系统要求
- Windows 10 或 11,或具有 X11 或 Wayland 的 Linux 发行版。
- 从源代码编译:.NET 10 SDK。
- 运行已发布的二进制文件:除了独立的可执行文件本身外,不需要其他任何东西。
## 编译与运行
在任意平台的代码库根目录下执行:
```
dotnet run --project App/App.csproj
```
## 测试
```
dotnet test
```
该测试套件涵盖了单元测试、端到端集成测试(保险箱的创建、持久化和重新加载)、安全性测试(拒绝篡改的数据和错误的密钥)以及包含大量密码的性能测试。
## 生成可执行文件
为 Windows x64 生成单个独立的可执行文件:
```
dotnet publish App/App.csproj -f net10.0-windows10.0.19041.0 -c Release -r win-x64 --self-contained true -p:PublishSingleFile=true -p:EnableCompressionInSingleFile=true -o publish
```
`CofreDeSenhas.exe` 文件将在 `publish` 文件夹中创建。
为 Linux x64 生成:
```
dotnet publish App/App.csproj -f net10.0 -c Release -r linux-x64 --self-contained -o publish-linux
```
### Windows 安装程序
安装程序(`CofreDeSenhas-Setup-X.Y.Z.exe`)是使用 [Inno Setup](https://jrsoftware.org/isinfo.php) 从已发布的可执行文件生成的。安装 Inno Setup(`winget install JRSoftware.InnoSetup`)后,运行:
```
.\App\distribuicao\gerar-instalador.ps1
```
该脚本会发布应用程序(与上述命令相同)并编译 `App/distribuicao/cofre-de-senhas.iss`,将安装程序输出到 `dist/`。版本号会自动从 `App/App.csproj` 中读取(也可以通过 `-Versao X.Y.Z` 指定)。
安装程序不需要管理员权限(仅为当前用户安装在 `%LocalAppData%\Programs\Cofre de Senhas`,并提供为所有用户安装的选项),会在开始菜单中创建快捷方式,并在“应用和功能”中注册卸载信息。卸载时,`%APPDATA%\GerenciadorSenhas` 中的保险箱数据默认会被保留——删除它们需要在对话框中进行明确确认(默认选项为“否”);静默卸载(`/VERYSILENT`)绝不会删除保险箱。
脚本 `App/distribuicao/instalar.sh` 会执行此发布操作,并在桌面环境中注册快捷方式和图标。
## 数据存储
应用程序文件在 Windows 上位于 `%APPDATA%\GerenciadorSenhas\`,在 Linux 上位于 `~/.config/GerenciadorSenhas/`:
- `auth.dat`:主密码的 salt 和验证器。
- `senhas.json.enc`:包含凭证的加密保险箱。
- `biometria.dat`:加密并绑定到 Windows Hello 凭证的保险箱密钥,用于此设备上激活生物识别解锁时。
- `config.json`:界面偏好设置(如语言和无障碍功能)以及最后一次的数据库连接配置(不含服务器密码)。
- `backups/`:保险箱的备份副本。
这些文件不属于代码库的一部分,并且包含敏感数据。
## 路线图
已完成及未来规划的功能详见 [ROADMAP.md](ROADMAP.md)。
## 如何贡献
欢迎贡献。随时欢迎提交 issue 报告问题或提出改进建议,或发送 pull request。一些简单的指导原则:
- 保持现有的代码风格。
- 尽可能为新增功能附带测试。
- 清楚地描述您的更改内容及其原因。
## 许可证
基于 MIT 许可证分发。请查阅 [LICENSE](LICENSE) 文件以了解完整条款。简而言之:您可以使用、复制、修改和分发此软件(包括在商业项目中),只要保留原始的版权声明和许可。
标签:AES-256-GCM, Avalonia, 密码管理器, 测试用例, 跨平台桌面应用