Skip to content

Repository files navigation

🦊 LynPass — 军工级 Android 本地密码管理器

版本: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 10000

📂 文件说明

LynPass/
├── 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 开发
🔒 你的密码,只属于你。

About

No description, website, or topics provided.

Resources

Stars

1 star

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages