基于 AES-GCM 与 PBKDF2 的跨平台桌面应用,支持将任意字符串加密为 Base64 并用相同口令安全解密恢复原文。采用 Java 17 + JavaFX 17 + Maven 构建,界面简洁、离线可用、易于二次开发。
String Encryptor 是一个用于演示与实用的加密小工具:
- 使用用户输入的口令派生出对称密钥,采用 AES-GCM 模式加密字符串;
- 输出格式为 Base64,以自定义头标识(MAGIC)+ 盐(SALT)+ 初始向量(IV)+ 密文与认证标签的二进制拼接;
- 解密时自动解析并验证格式与完整性。
该应用适合需要在本地快速加密/解密敏感片段的场景,也可作为更大型系统中的加密模块参考实现。
- AES-GCM + PBKDF2(HMAC-SHA256)安全组合,具备保密性与完整性校验
- 随机 16 字节盐、12 字节 GCM IV,每次加密输出不同密文(抗重放/字典攻击)
- 迭代 120,000 次的 PBKDF2(可调),提升口令抗暴力破解能力
- 纯 Java 实现,跨平台运行,离线使用,不依赖外部服务
- JavaFX 现代界面,输入框支持中英文、符号、表情等
- 代码简洁清晰,易读易测,适合教学与工程落地
┌───────────────────────────────────────────────────────────┐
│JavaFX UI 层
│FXML 布局 + Controller(交互逻辑、输入校验、状态提示)
└───────────────▲───────────────────────────────────────────┘
│
│ 调用
│
┌───────────────┴───────────────────────────────────────────┐
│Crypto 工具层(纯 Java)
│PBKDF2 口令派生 → AES-GCM 加密/解密 → Base64 编解码
└───────────────────────────────────────────────────────────┘
- 入口:
com.encryption.Main(JavaFX 应用启动) - UI:
main-view.fxml+MainController(加密/解密/清空按钮与状态反馈) - 核心:
CryptoUtil(算法与数据格式)
EncryptionApp/
├─ pom.xml # Maven 构建与依赖(JavaFX 17)
├─ run.bat # Windows 快速运行脚本
├─ src/
│ └─ main/
│ ├─ java/
│ │ └─ com/encryption/
│ │ ├─ Main.java # JavaFX 启动入口
│ │ ├─ ui/MainController.java
│ │ └─ crypto/CryptoUtil.java
│ └─ resources/
│ └─ com/encryption/ui/main-view.fxml
└─ .gitignore
Java 17(建议 OpenJDK 17)Maven 3.8+- 首次构建需联网以下载依赖(后续离线可运行)
- Windows:双击
run.bat或在终端执行:
.\run.bat- 跨平台(Windows/macOS/Linux):在项目根目录运行:
mvn clean javafx:run- 在“密码”框输入口令(不会被保存);
- 在“明文”框输入要加密的字符串,点击“加密”;
- 复制“密文(Base64)”;
- 在“密文(Base64)”框粘贴密文,点击“解密”,结果显示在“解密结果”。
遇到错误时,底部状态栏会给出中文提示(如“密文不是合法的 Base64”)。
// 加密
String cipher = CryptoUtil.encryptToBase64("Hello, 世界", "StrongPassword!".toCharArray());
// 解密
String plain = CryptoUtil.decryptFromBase64(cipher, "StrongPassword!".toCharArray());- 口令派生:PBKDF2(HMAC-SHA256),默认迭代
120_000次,密钥长度 256 位; - 加密算法:AES-GCM,无填充;认证标签 128 位;
- 随机性:每次加密会生成新的盐(16B)与 IV(12B);
- 载荷格式:
Base64(MAGIC[4] + SALT[16] + IV[12] + CIPHERTEXT_AND_TAG[N]); - 敏感数据:界面层使用
char[]接收口令,并在finally块中清零(尽量减少驻留时间); - 注意事项:请使用高强度口令,避免弱口令带来的安全风险;建议在生产场景中增加口令复杂度策略与密钥轮换机制。
- 可在
CryptoUtil中调整以下参数以满足不同安全与性能需求:PBKDF2_ITERS(默认 120,000,增大可提高暴力破解成本)KEY_BITS(默认 256,AES-256)TAG_BITS(默认 128,GCM 认证标签位数)SALT_LEN/IV_LEN(默认 16 / 12,符合常规实践)
- 可扩展功能示例:
- 文件加密/解密(目前为字符串)
- 命令行模式(CLI)与批量处理
- 导出/导入配置(如迭代次数、算法参数)
- 多语言与深色模式
- 构建与运行:
mvn clean javafx:run - 使用 JDK 17 编译:
maven-compiler-plugin(<release>17</release>) - JavaFX 依赖由 Maven 自动下载,无需手动放置
lib - 项目结构与依赖定义见
pom.xml
- 增加单元测试与持续集成(CI)
- 提供命令行可执行包(跨平台)
- 支持文件与目录加解密
- 增加国际化(i18n)与界面主题
- 提供可插拔的算法策略(如 Argon2 派生)
欢迎通过 Issue / PR 提交改进:
- 保持代码风格一致与命名规范统一;
- 添加必要的单元测试与文档说明;
- 对安全相关的更改请附详细的设计与风险评估。
当前仓库尚未设置开源许可证。建议根据项目目标选择:MIT / Apache-2.0 / GPL-3.0 等,并在根目录添加 LICENSE 文件(参考 https://choosealicense.com/ )。
- OpenJFX / JavaFX 提供跨平台桌面 UI 能力
- Java 标准库的加密支持(
javax.crypto)
- 运行提示找不到 JavaFX?请确认使用
JDK 17+并通过 Maven 构建(不要直接用java命令运行)。 - 解密报“MAGIC 不匹配”?确保使用本应用生成的密文(格式含 MAGIC 头标识)。
- 解密报“密文不是合法的 Base64”?检查复制/粘贴是否包含多余空白或截断。
- 输出为空或乱码?确保明文为 UTF-8 可编码字符,且口令一致。
为提升项目曝光度,可考虑:
- 在 GitHub 添加项目标签与主题:
java,javafx,cryptography,aes-gcm,pbkdf2,security,desktop-app - 在 README 顶部放置演示截图或 GIF(操作流程:输入口令 → 加密 → 复制密文 → 解密)
- 发布一篇技术文章(掘金/知乎/简书),介绍设计思路与安全权衡,并附仓库链接
- 在相关社区(Java/安全/桌面应用)同步更新与版本发布
- 提供二进制发行版(Windows
.exe/macOS.app/Linux AppImage),降低试用门槛
如果该项目对你有帮助,欢迎 Star 或分享给同事与朋友,感谢支持!