版本:1.1.2
包名: com.lynvortex.lynpass
最低 SDK: Android 8.1 (API 26)
目标 SDK: Android 14 (API 34)
LynPass 是一款军工级本地密码管理器,采用 Argon2id 密钥派生 + AES‑256‑GCM 数据加密 + HMAC 完整性保护 的多层安全架构,将所有密码安全存储于单个加密文件(vault.pass)中。程序完全离线运行,无需网络连接,无服务端,数据永远掌握在你手中。
主要应用场景:安全存储网站/应用的用户名与密码,生成高强度随机密码,防止密码重用和弱密码带来的安全风险。
| 特性 | 说明 |
|---|---|
| 🔐 强加密体系 | Argon2id (64 MiB 内存) 密钥派生 + AES‑256‑GCM 认证加密 + HMAC‑SHA256 完整性校验 |
| 🧹 内存安全 | 主密码以 ByteArray 存储,加密操作后立即 fill(0) 安全擦除 |
| 🛡 防暴力破解 | 连续输错 10 次密码后永久锁定,锁定计数器使用 EncryptedSharedPreferences 加密存储,防 root 篡改 |
| 🔑 强密码生成器 | 内置密码生成器,支持自定义长度(8‑64)、包含符号、排除易混淆字符(l/1/O/0),基于 SecureRandom |
| 📦 单文件存储 | 所有密码存储于一个加密文件 vault.pass,可轻松备份至 U 盘或云盘 |
| 📋 剪贴板保护 | 复制密码 15 秒后自动清除(验证剪贴板内容未被替换后才清除) |
| 🔒 自动锁定 | 支持手动锁定,回到登录界面 |
| 🔍 搜索 | 在搜索框输入关键词,快速过滤条目 |
| 🖼 自定义图标 | 支持 icon.ico 图标文件 |
| 🔐 主密码修改 | 支持修改主密码,原密码验证通过后重新加密全部数据 |
| 🚫 备份排除 | vault.pass 不参与 Android 系统自动备份 |
主密码 + 随机盐 (16 字节)
│
▼
Argon2id (64 MiB 内存, 4 通道, 3 轮迭代)
│
▼
64 字节密钥材料
├── 前 32 字节 → AES-256-GCM 加密密钥 (Enc Key)
└── 后 32 字节 → HMAC-SHA256 完整性密钥 (Mac Key)
[ 4 字节魔数 "LYNX" ]
[ 1 字节版本号 ]
[16 字节随机盐 ]
[12 字节 Nonce ]
[AES-256-GCM 密文 ] ← 含 16 字节 GCM 认证标签
[32 字节 HMAC-SHA256 ]
HMAC 覆盖范围:版本号 + 盐 + Nonce + 密文。任何篡改都会导致 HMAC 验证失败。
- 失败尝试次数和锁定时间使用 EncryptedSharedPreferences(AES-256-GCM 加密 + AES-256-SIV 密钥加密)存储,即使获取 root 权限也无法篡改
- 连续 10 次密码错误后 永久锁定,不再提供自毁功能(防止恶意 DoS 攻击导致数据永久丢失)
- 通过
SharedPreferences接口直接使用,无文件锁竞态问题
- 主密码以
ByteArray形式传递,每次加密/解密操作完成后立即fill(0)覆写 - 派生密钥材料的中间缓冲区(
output)在使用后立即通过try-finally清除 - 密码明文不在堆中长期留存
- 写入使用 原子保存:先写入临时文件并
fsync,再通过Files.move(ATOMIC_MOVE)原子替换目标文件 - 若平台不支持原子移动,回退为删除旧文件 + 重命名(保证至少不会同时丢失两份文件)
- 复制密码 15 秒后自动清除
- 清除前验证剪贴板内容未被用户/其他应用替换(对比文本内容)
- 锁定/退出时不清除(用户主动操作),但密码在应用内不再可访问
| 解锁界面 | 密码列表 | 添加/编辑 |
|---|---|---|
| 输入主密码解锁或创建新保险库 | 搜索、浏览密码条目 | 添加或编辑网站/用户名/密码 |
- Android Studio Hedgehog (2023.1.1+) 或 IntelliJ IDEA
- JDK 17+
- Android SDK 34
# 调试构建(未签名,可安装调试)
./gradlew assembleDebug
# 发布构建(签名 + ProGuard 混淆)
./gradlew assembleRelease构建产物位于:
app/build/outputs/apk/debug/app-debug.apk # 调试版 (17MB)
app/build/outputs/apk/release/app-release.apk # 发布版 (4.8MB)
# 生成密钥库(如已存在则跳过)
keytool -genkey -v -keystore lynpass.jks -alias lynpass -keyalg RSA -keysize 2048 -validity 10000LynPass/
├── app/
│ ├── src/main/
│ │ ├── java/com/lynvortex/lynpass/
│ │ │ ├── MainActivity.kt # 主界面(Compose UI)
│ │ │ ├── CryptoUtils.kt # 加密/解密工具函数
│ │ │ ├── VaultManager.kt # 保险库管理(文件IO + 锁定状态)
│ │ │ └── ui/theme/ # Material 3 主题
│ │ ├── res/
│ │ │ ├── drawable/ # 图标背景/前景
│ │ │ ├── mipmap-*/ # 启动图标(各密度)
│ │ │ └── xml/ # 备份规则
│ │ └── AndroidManifest.xml
│ ├── build.gradle.kts
│ └── proguard-rules.pro
├── gradle/wrapper/
├── build.gradle.kts # 根构建脚本
├── settings.gradle.kts
├── gradle.properties
├── lynpass.jks # 发布密钥库(运行时生成)
├── icon.ico # 应用图标源文件
└── README.md
生成的运行时文件:
vault.pass # 加密保险库文件(运行后生成)
- 主密码丢失不可恢复,请妥善保管
- 建议关闭 Windows 剪贴板历史记录(
Win+V→ 设置 → 关闭"剪贴板历史记录") - 备份
vault.pass文件时注意介质安全,文件本身已加密,但仍建议存储于可信位置 - Android 版本最低支持 API 26(Android 8.1 Oreo)
| 版本 | 说明 |
|---|---|
| v1.1.2 | 安全增强版 • 修复自毁导致的数据永久丢失风险 → 改为永久锁定 • 锁定计数器改用 EncryptedSharedPreferences 加密存储 • 原子保存防止文件损坏 • 密码 ByteArray 用后清除 • 新增自定义图标 • ProGuard/R8 混淆保护 • 备份规则排除保险库文件 |
| v1.0.0 | 初始版本 • Argon2id + AES-256-GCM + HMAC • Compose Material 3 UI • 搜索/添加/编辑/删除密码 • 密码生成器 • 剪贴板自动清除 • 暴力破解防护 |
本项目基于 MIT 许可证开源。
LynPass — 由 LynVortex 开发
🔒 你的密码,只属于你。